From 1b5271f27f7d5c6f814567d6d3bf211b41244cc8 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 15 Dec 2016 16:20:27 +0100 Subject: determine compiler version at build time, not in configure this makes it consistent with the determination of the default include/library paths. this makes sense, as it's possible to switch the sdk/toolchain after building qt (within reason). a side effect of this change is that for compilers which emulate other compilers, both the real and the emulated version are now made available. Change-Id: Icfcc672c0d2e3d1b5e622993c366063d70ad327c Started-by: Thiago Macieira Reviewed-by: Lars Knoll --- mkspecs/common/msvc-desktop.conf | 2 +- mkspecs/features/data/macros.cpp | 28 ++++++++++++ mkspecs/features/toolchain.prf | 76 ++++++++++++++++++++++++++++++++ mkspecs/winphone-arm-msvc2013/qmake.conf | 1 - mkspecs/winphone-x86-msvc2013/qmake.conf | 1 - mkspecs/winrt-arm-msvc2013/qmake.conf | 1 - mkspecs/winrt-arm-msvc2015/qmake.conf | 1 - mkspecs/winrt-x64-msvc2013/qmake.conf | 1 - mkspecs/winrt-x64-msvc2015/qmake.conf | 2 +- mkspecs/winrt-x86-msvc2013/qmake.conf | 2 +- mkspecs/winrt-x86-msvc2015/qmake.conf | 2 +- 11 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 mkspecs/features/data/macros.cpp (limited to 'mkspecs') diff --git a/mkspecs/common/msvc-desktop.conf b/mkspecs/common/msvc-desktop.conf index 1b9d57bff0..ebe804db64 100644 --- a/mkspecs/common/msvc-desktop.conf +++ b/mkspecs/common/msvc-desktop.conf @@ -16,7 +16,7 @@ QMAKE_PLATFORM = win32 QMAKE_COMPILER = msvc CONFIG += incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe DEFINES += UNICODE WIN32 -QMAKE_COMPILER_DEFINES += _MSC_VER=$$MSC_VER _WIN32 +QMAKE_COMPILER_DEFINES += _WIN32 contains(QMAKE_TARGET.arch, x86_64) { DEFINES += WIN64 QMAKE_COMPILER_DEFINES += _WIN64 diff --git a/mkspecs/features/data/macros.cpp b/mkspecs/features/data/macros.cpp new file mode 100644 index 0000000000..88473fb980 --- /dev/null +++ b/mkspecs/features/data/macros.cpp @@ -0,0 +1,28 @@ +// Keep this file small. The pre-processed contents are eval'd by qmake. +#ifdef _MSC_VER +QMAKE_MSC_VER = _MSC_VER +QMAKE_MSC_FULL_VER = _MSC_FULL_VER +#endif +#ifdef __INTEL_COMPILER +QMAKE_ICC_VER = __INTEL_COMPILER +QMAKE_ICC_UPDATE_VER = __INTEL_COMPILER_UPDATE +#endif +#ifdef __APPLE_CC__ +QMAKE_APPLE_CC = __APPLE_CC__ +#endif +#ifdef __clang__ +#ifdef __APPLE_CC__ +QT_APPLE_CLANG_MAJOR_VERSION = __clang_major__ +QT_APPLE_CLANG_MINOR_VERSION = __clang_minor__ +QT_APPLE_CLANG_PATCH_VERSION = __clang_patchlevel__ +#else +QT_CLANG_MAJOR_VERSION = __clang_major__ +QT_CLANG_MINOR_VERSION = __clang_minor__ +QT_CLANG_PATCH_VERSION = __clang_patchlevel__ +#endif +#endif +#ifdef __GNUC__ +QT_GCC_MAJOR_VERSION = __GNUC__ +QT_GCC_MINOR_VERSION = __GNUC_MINOR__ +QT_GCC_PATCH_VERSION = __GNUC_PATCHLEVEL__ +#endif diff --git a/mkspecs/features/toolchain.prf b/mkspecs/features/toolchain.prf index 0ef0fa8fc7..2fccd64fc5 100644 --- a/mkspecs/features/toolchain.prf +++ b/mkspecs/features/toolchain.prf @@ -58,3 +58,79 @@ isEmpty(QMAKE_DEFAULT_INCDIRS):!host_build { !isEmpty(QMAKE_DEFAULT_INCDIRS): cache(QMAKE_DEFAULT_INCDIRS, set stash) !isEmpty(QMAKE_DEFAULT_LIBDIRS): cache(QMAKE_DEFAULT_LIBDIRS, set stash) } + +# +# Determine and cache the compiler version +# + +defineReplace(qtVariablesFromMSVC) { + return($$system("$$1 -nologo -E $$2 $$system_quote($$PWD/data/macros.cpp) NUL", lines)) +} + +defineReplace(qtVariablesFromGCC) { + null_device = /dev/null + equals(QMAKE_HOST.os, Windows): null_device = NUL + return($$system("$$1 -E $$system_quote($$PWD/data/macros.cpp) <$$null_device 2>$$null_device", lines)) +} + +host_build: \ + target_prefix = QMAKE_HOST_CXX +else: \ + target_prefix = QMAKE_CXX + +isEmpty($${target_prefix}.COMPILER_MACROS) { + msvc { + vars = $$qtVariablesFromMSVC($$QMAKE_CXX $$QMAKE_CXXFLAGS) + } else: gcc { + vars = $$qtVariablesFromGCC($$QMAKE_CXX) + } + for (v, vars) { + isEmpty(v)|contains(v, $${LITERAL_HASH}.*): next() + # Set both for the outer scope ... + eval($$v) + v ~= s/ .*// + isEmpty($$v): error("Compiler produced empty value for $${v}.") + # ... and save QMAKE_(HOST_)?CXX. in the cache. + cache($${target_prefix}.$$v, set stash, $$v) + $${target_prefix}.COMPILER_MACROS += $$v + } + cache($${target_prefix}.COMPILER_MACROS, set stash) +} else { + # load from the cache + for (i, $${target_prefix}.COMPILER_MACROS): \ + $$i = $$eval($${target_prefix}.$$i) +} + +unset(target_prefix) + +# Populate QMAKE_COMPILER_DEFINES and some compatibility variables. +# The $$format_number() calls strip leading zeros to avoid misinterpretation as octal. +!isEmpty(QMAKE_MSC_VER) { + QMAKE_COMPILER_DEFINES += _MSC_VER=$$QMAKE_MSC_VER _MSC_FULL_VER=$$QMAKE_MSC_FULL_VER + QT_MSVC_MAJOR_VERSION = $$replace(QMAKE_MSC_FULL_VER, "(..)(..)(.*)", "\\1") + QT_MSVC_MINOR_VERSION = $$format_number($$replace(QMAKE_MSC_FULL_VER, "(..)(..)(.*)", "\\2")) + QT_MSVC_PATCH_VERSION = $$replace(QMAKE_MSC_FULL_VER, "(..)(..)(.*)", "\\3")) +} +!isEmpty(QMAKE_ICC_VER) { + QMAKE_COMPILER_DEFINES += __INTEL_COMPILER=$$QMAKE_ICC_VER __INTEL_COMPILER_UPDATE=$$QMAKE_ICC_UPDATE_VER + QT_ICC_MAJOR_VERSION = $$replace(QMAKE_ICC_VER, "(..)(..)", "\\1") + QT_ICC_MINOR_VERSION = $$format_number($$replace(QMAKE_ICC_VER, "(..)(..)", "\\2")) + QT_ICC_PATCH_VERSION = $$QMAKE_ICC_UPDATE_VER +} +!isEmpty(QMAKE_APPLE_CC): \ + QMAKE_COMPILER_DEFINES += __APPLE_CC__=$$QMAKE_APPLE_CC +!isEmpty(QT_APPLE_CLANG_MAJOR_VERSION): \ + QMAKE_COMPILER_DEFINES += __clang__ \ + __clang_major__=$$QT_APPLE_CLANG_MAJOR_VERSION \ + __clang_minor__=$$QT_APPLE_CLANG_MINOR_VERSION \ + __clang_patchlevel__=$$QT_APPLE_CLANG_PATCH_VERSION +!isEmpty(QT_CLANG_MAJOR_VERSION): \ + QMAKE_COMPILER_DEFINES += __clang__ \ + __clang_major__=$$QT_CLANG_MAJOR_VERSION \ + __clang_minor__=$$QT_CLANG_MINOR_VERSION \ + __clang_patchlevel__=$$QT_CLANG_PATCH_VERSION +!isEmpty(QT_GCC_MAJOR_VERSION): \ + QMAKE_COMPILER_DEFINES += \ + __GNUC__=$$QT_GCC_MAJOR_VERSION \ + __GNUC_MINOR__=$$QT_GCC_MINOR_VERSION \ + __GNUC_PATCHLEVEL__=$$QT_GCC_PATCH_VERSION diff --git a/mkspecs/winphone-arm-msvc2013/qmake.conf b/mkspecs/winphone-arm-msvc2013/qmake.conf index ca2cc50e84..64ff295f14 100644 --- a/mkspecs/winphone-arm-msvc2013/qmake.conf +++ b/mkspecs/winphone-arm-msvc2013/qmake.conf @@ -5,7 +5,6 @@ # include(../common/winrt_winphone/qmake.conf) -QMAKE_COMPILER_DEFINES += _MSC_VER=1800 QMAKE_PLATFORM = winphone $$QMAKE_PLATFORM DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP ARM __ARM__ __ARM__ CONFIG += no_generated_target_info diff --git a/mkspecs/winphone-x86-msvc2013/qmake.conf b/mkspecs/winphone-x86-msvc2013/qmake.conf index ad8dbe1fee..bc074f03dd 100644 --- a/mkspecs/winphone-x86-msvc2013/qmake.conf +++ b/mkspecs/winphone-x86-msvc2013/qmake.conf @@ -5,7 +5,6 @@ # include(../common/winrt_winphone/qmake.conf) -QMAKE_COMPILER_DEFINES += _MSC_VER=1800 QMAKE_PLATFORM = winphone $$QMAKE_PLATFORM DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP X86 __X86__ __x86__ CONFIG += no_generated_target_info diff --git a/mkspecs/winrt-arm-msvc2013/qmake.conf b/mkspecs/winrt-arm-msvc2013/qmake.conf index f8b48b0829..547884ce7e 100644 --- a/mkspecs/winrt-arm-msvc2013/qmake.conf +++ b/mkspecs/winrt-arm-msvc2013/qmake.conf @@ -5,7 +5,6 @@ # include(../common/winrt_winphone/qmake.conf) -QMAKE_COMPILER_DEFINES += _MSC_VER=1800 DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP ARM __ARM__ __arm__ QMAKE_CFLAGS += -FS diff --git a/mkspecs/winrt-arm-msvc2015/qmake.conf b/mkspecs/winrt-arm-msvc2015/qmake.conf index 7a9375246d..ef145ae44b 100644 --- a/mkspecs/winrt-arm-msvc2015/qmake.conf +++ b/mkspecs/winrt-arm-msvc2015/qmake.conf @@ -6,7 +6,6 @@ MSC_VER = 1900 include(../common/winrt_winphone/qmake.conf) -QMAKE_COMPILER_DEFINES += _MSC_VER=1900 DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 ARM __ARM__ __arm__ QMAKE_CFLAGS += -FS diff --git a/mkspecs/winrt-x64-msvc2013/qmake.conf b/mkspecs/winrt-x64-msvc2013/qmake.conf index 594d0dafd0..c90db8b314 100644 --- a/mkspecs/winrt-x64-msvc2013/qmake.conf +++ b/mkspecs/winrt-x64-msvc2013/qmake.conf @@ -5,7 +5,6 @@ # include(../common/winrt_winphone/qmake.conf) -QMAKE_COMPILER_DEFINES += _MSC_VER=1800 DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_APP X64 __X64__ __x64__ QMAKE_CFLAGS += -FS diff --git a/mkspecs/winrt-x64-msvc2015/qmake.conf b/mkspecs/winrt-x64-msvc2015/qmake.conf index ca2dc88bf0..3bf5aa4bc8 100644 --- a/mkspecs/winrt-x64-msvc2015/qmake.conf +++ b/mkspecs/winrt-x64-msvc2015/qmake.conf @@ -6,7 +6,7 @@ MSC_VER = 1900 include(../common/winrt_winphone/qmake.conf) -QMAKE_COMPILER_DEFINES += _MSC_VER=1900 _WIN32 +QMAKE_COMPILER_DEFINES += _WIN32 DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 X64 __X64__ __x64__ QMAKE_CFLAGS += -FS diff --git a/mkspecs/winrt-x86-msvc2013/qmake.conf b/mkspecs/winrt-x86-msvc2013/qmake.conf index 3359102e7e..729a0ba068 100644 --- a/mkspecs/winrt-x86-msvc2013/qmake.conf +++ b/mkspecs/winrt-x86-msvc2013/qmake.conf @@ -5,7 +5,7 @@ # include(../common/winrt_winphone/qmake.conf) -QMAKE_COMPILER_DEFINES += _MSC_VER=1800 _WIN32 +QMAKE_COMPILER_DEFINES += _WIN32 DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP X86 __X86__ __x86__ QMAKE_CFLAGS += -FS diff --git a/mkspecs/winrt-x86-msvc2015/qmake.conf b/mkspecs/winrt-x86-msvc2015/qmake.conf index 3b2681e93d..00d9126790 100644 --- a/mkspecs/winrt-x86-msvc2015/qmake.conf +++ b/mkspecs/winrt-x86-msvc2015/qmake.conf @@ -6,7 +6,7 @@ MSC_VER = 1900 include(../common/winrt_winphone/qmake.conf) -QMAKE_COMPILER_DEFINES += _MSC_VER=1900 _WIN32 +QMAKE_COMPILER_DEFINES += _WIN32 DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 X86 __X86__ __x86__ QMAKE_CFLAGS += -FS -- cgit v1.2.3