fix QMAKE_DEFAULT_*DIRS resolution with apple SDK, take 2
the code got factored out to an own toolchain.prf file, which is
load()ed from default_pre.prf, so no change at first.
however, on mac, we shadow toolchain.prf, and make it load() sdk.prf
first.
a side effect, it has become harder to disable the use of an sdk
altogether: putting CONFIG-=sdk into a project file or the qmake
command line has no effect now. instead, it's possible to put it into
.qmake.{conf,cache}.
to make it simpler again, it's conceivable to finally add qmake -pre,
which would allow setting variables before default_pre.prf is executed.
take 2: there was nothing wrong with the original patch, but in 5.8,
CONFIG+=simulator_and_device moved from qconfig.pri to various prf files
that would do it according to the simulator_and_device configure
feature, which would be way too late for the "pulled ahead" sdk.prf
loading. as simulator_and_device is now gone entirely, it is safe to
re-apply this patch (mostly) as-is.
Task-number: QTBUG-56144
Change-Id: I6cf484982eaed8af39f7a539c60f5a087a299914
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2016-10-14 11:14:13 +00:00
|
|
|
|
2016-11-24 17:41:57 +00:00
|
|
|
# In early configure setup; nothing useful to be done here.
|
|
|
|
isEmpty(QMAKE_CXX): return()
|
|
|
|
|
2016-10-17 19:18:57 +00:00
|
|
|
defineReplace(qtMakeExpand) {
|
|
|
|
out = "$$1"
|
|
|
|
for(ever) {
|
2016-10-20 08:10:25 +00:00
|
|
|
m = $$replace(out, ".*\\$\\(EXPORT_([^)]+)\\).*", \\1)
|
2016-10-17 19:18:57 +00:00
|
|
|
equals(m, $$out): \
|
|
|
|
return($$out)
|
2016-10-20 08:10:25 +00:00
|
|
|
out = $$replace(out, "\\$\\(EXPORT_$$m\\)", $$eval($$m))
|
2016-10-17 19:18:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-04 09:01:25 +00:00
|
|
|
defineTest(qtCompilerErrror) {
|
|
|
|
!cross_compile: \
|
|
|
|
what =
|
|
|
|
else: host_build: \
|
|
|
|
what = " host"
|
|
|
|
else: \
|
|
|
|
what = " target"
|
|
|
|
error("Cannot run$$what compiler '$$1'. Maybe you forgot to setup the environment?")
|
|
|
|
}
|
|
|
|
|
2017-01-12 19:58:45 +00:00
|
|
|
cross_compile:host_build: \
|
determine QMAKE_DEFAULT_{INC,LIB}DIRS separately for host and target
note that in principle this leaves room for a race condition, as the
first project to determine the host config is not going to be the
top-level one.
in qtbase and qtdeclarative, this is naturally serialized via the common
bootstrapped libraries (bootstrap resp. qmldevtools). activeqt, qt3d,
qtscxml, and qtwayland all build only one bootstrapped tool each.
qtwebengine makes a fake host build to create files for gyp/gn; the
convert_dict tool is declared a host tool, but isn't actually built when
x-building anyway, and even if, it's serialized on the former. qttools
needs explicit serialization, though. no other host builds exist within
qt as of now.
Task-number: QTBUG-58126
Change-Id: I81a02a2d98f2bfe5d6aaa51119d5e7919549f119
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2017-01-12 19:52:51 +00:00
|
|
|
target_prefix = QMAKE_HOST_CXX
|
|
|
|
else: \
|
|
|
|
target_prefix = QMAKE_CXX
|
|
|
|
|
|
|
|
isEmpty($${target_prefix}.INCDIRS) {
|
fix QMAKE_DEFAULT_*DIRS resolution with apple SDK, take 2
the code got factored out to an own toolchain.prf file, which is
load()ed from default_pre.prf, so no change at first.
however, on mac, we shadow toolchain.prf, and make it load() sdk.prf
first.
a side effect, it has become harder to disable the use of an sdk
altogether: putting CONFIG-=sdk into a project file or the qmake
command line has no effect now. instead, it's possible to put it into
.qmake.{conf,cache}.
to make it simpler again, it's conceivable to finally add qmake -pre,
which would allow setting variables before default_pre.prf is executed.
take 2: there was nothing wrong with the original patch, but in 5.8,
CONFIG+=simulator_and_device moved from qconfig.pri to various prf files
that would do it according to the simulator_and_device configure
feature, which would be way too late for the "pulled ahead" sdk.prf
loading. as simulator_and_device is now gone entirely, it is safe to
re-apply this patch (mostly) as-is.
Task-number: QTBUG-56144
Change-Id: I6cf484982eaed8af39f7a539c60f5a087a299914
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2016-10-14 11:14:13 +00:00
|
|
|
#
|
|
|
|
# Get default include and library paths from compiler
|
|
|
|
#
|
|
|
|
gcc {
|
|
|
|
!equals(QMAKE_HOST.os, Windows) {
|
|
|
|
cmd_prefix = "LC_ALL=C"
|
|
|
|
cmd_suffix = "</dev/null >/dev/null"
|
2017-06-06 19:34:56 +00:00
|
|
|
null_file = /dev/null
|
fix QMAKE_DEFAULT_*DIRS resolution with apple SDK, take 2
the code got factored out to an own toolchain.prf file, which is
load()ed from default_pre.prf, so no change at first.
however, on mac, we shadow toolchain.prf, and make it load() sdk.prf
first.
a side effect, it has become harder to disable the use of an sdk
altogether: putting CONFIG-=sdk into a project file or the qmake
command line has no effect now. instead, it's possible to put it into
.qmake.{conf,cache}.
to make it simpler again, it's conceivable to finally add qmake -pre,
which would allow setting variables before default_pre.prf is executed.
take 2: there was nothing wrong with the original patch, but in 5.8,
CONFIG+=simulator_and_device moved from qconfig.pri to various prf files
that would do it according to the simulator_and_device configure
feature, which would be way too late for the "pulled ahead" sdk.prf
loading. as simulator_and_device is now gone entirely, it is safe to
re-apply this patch (mostly) as-is.
Task-number: QTBUG-56144
Change-Id: I6cf484982eaed8af39f7a539c60f5a087a299914
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2016-10-14 11:14:13 +00:00
|
|
|
} else {
|
|
|
|
cmd_prefix = "set LC_ALL=C&"
|
|
|
|
cmd_suffix = "<NUL >NUL"
|
2017-06-06 19:34:56 +00:00
|
|
|
null_file = NUL
|
fix QMAKE_DEFAULT_*DIRS resolution with apple SDK, take 2
the code got factored out to an own toolchain.prf file, which is
load()ed from default_pre.prf, so no change at first.
however, on mac, we shadow toolchain.prf, and make it load() sdk.prf
first.
a side effect, it has become harder to disable the use of an sdk
altogether: putting CONFIG-=sdk into a project file or the qmake
command line has no effect now. instead, it's possible to put it into
.qmake.{conf,cache}.
to make it simpler again, it's conceivable to finally add qmake -pre,
which would allow setting variables before default_pre.prf is executed.
take 2: there was nothing wrong with the original patch, but in 5.8,
CONFIG+=simulator_and_device moved from qconfig.pri to various prf files
that would do it according to the simulator_and_device configure
feature, which would be way too late for the "pulled ahead" sdk.prf
loading. as simulator_and_device is now gone entirely, it is safe to
re-apply this patch (mostly) as-is.
Task-number: QTBUG-56144
Change-Id: I6cf484982eaed8af39f7a539c60f5a087a299914
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2016-10-14 11:14:13 +00:00
|
|
|
}
|
2017-01-26 02:52:22 +00:00
|
|
|
|
|
|
|
cxx_flags = $$QMAKE_CXXFLAGS
|
|
|
|
|
|
|
|
# Manually inject the sysroot for Apple Platforms because its resolution
|
|
|
|
# normally does not happen until default_post.prf. This is especially
|
|
|
|
# important for moc to gain the correct default include directory list.
|
|
|
|
# While technically incorrect but without any likely practical effect,
|
|
|
|
# UIKit simulator platforms will see the device SDK's sysroot in
|
|
|
|
# QMAKE_DEFAULT_*DIRS, because they're handled in a single build pass.
|
2017-06-28 16:01:37 +00:00
|
|
|
darwin {
|
|
|
|
uikit:macx-xcode: \
|
|
|
|
cxx_flags += -isysroot $$sdk_path_device.value
|
|
|
|
else: \
|
|
|
|
cxx_flags += -isysroot $$QMAKE_MAC_SDK_PATH
|
|
|
|
}
|
2017-01-26 02:52:22 +00:00
|
|
|
|
2017-06-06 19:34:56 +00:00
|
|
|
rim_qcc: \
|
|
|
|
# Need the cc1plus and ld command lines to pick up the paths
|
|
|
|
cxx_flags += $$QMAKE_LFLAGS_SHLIB -o $$null_file -v
|
2017-07-07 11:48:21 +00:00
|
|
|
else: darwin:clang: \
|
2017-05-30 12:43:08 +00:00
|
|
|
# Need to link to pick up library paths
|
|
|
|
cxx_flags += $$QMAKE_LFLAGS_SHLIB -o /dev/null -v -Wl,-v
|
|
|
|
else: \
|
2017-07-07 11:48:21 +00:00
|
|
|
# Just preprocess, might not pick up library paths
|
2017-05-30 12:43:08 +00:00
|
|
|
cxx_flags += -E -v
|
|
|
|
|
2017-06-08 12:39:05 +00:00
|
|
|
output = $$system("$$cmd_prefix $$QMAKE_CXX $$qtMakeExpand($$cxx_flags) -xc++ - 2>&1 $$cmd_suffix", lines, ec)
|
2017-08-04 09:01:25 +00:00
|
|
|
!equals(ec, 0): qtCompilerErrror($$QMAKE_CXX)
|
2017-06-06 19:34:56 +00:00
|
|
|
|
|
|
|
rim_qcc {
|
|
|
|
for (line, output) {
|
|
|
|
contains(line, "^[^ ]*cc1plus .*") {
|
|
|
|
take_next = false
|
|
|
|
for (parameter, $$list($$line)) {
|
|
|
|
$$take_next {
|
|
|
|
QMAKE_DEFAULT_INCDIRS += $$clean_path($$parameter)
|
|
|
|
take_next = false
|
|
|
|
} else: equals(parameter, "-isystem") {
|
|
|
|
take_next = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else: contains(line, "^[^ ]*-ld .*") {
|
|
|
|
for (parameter, $$list($$line)) {
|
|
|
|
contains(parameter, "^-L.*") {
|
|
|
|
parameter ~= s/^-L//
|
|
|
|
QMAKE_DEFAULT_LIBDIRS += $$clean_path($$parameter)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
add_includes = false
|
|
|
|
add_libraries = false
|
|
|
|
for (line, output) {
|
|
|
|
line ~= s/^[ \\t]*// # remove leading spaces
|
|
|
|
contains(line, "LIBRARY_PATH=.*") {
|
|
|
|
line ~= s/^LIBRARY_PATH=// # remove leading LIBRARY_PATH=
|
|
|
|
paths = $$split(line, $$QMAKE_DIRLIST_SEP)
|
|
|
|
for (path, paths): \
|
|
|
|
QMAKE_DEFAULT_LIBDIRS += $$clean_path($$path)
|
|
|
|
} else: contains(line, "Library search paths:") {
|
|
|
|
add_libraries = true
|
|
|
|
} else: contains(line, "$${LITERAL_HASH}include <.*") { # #include <...> search starts here:
|
|
|
|
add_includes = true
|
|
|
|
} else: contains(line, "End of search.*") {
|
|
|
|
add_includes = false
|
|
|
|
} else: $$add_libraries {
|
|
|
|
# We assume all library search paths are absolute
|
|
|
|
!contains(line, "^/.*") {
|
|
|
|
add_libraries = false
|
|
|
|
next()
|
|
|
|
}
|
|
|
|
QMAKE_DEFAULT_LIBDIRS += $$clean_path($$line)
|
|
|
|
} else: $$add_includes {
|
|
|
|
!contains(line, ".* \\(framework directory\\)"): \
|
|
|
|
QMAKE_DEFAULT_INCDIRS += $$clean_path($$line)
|
2017-05-30 12:43:08 +00:00
|
|
|
}
|
fix QMAKE_DEFAULT_*DIRS resolution with apple SDK, take 2
the code got factored out to an own toolchain.prf file, which is
load()ed from default_pre.prf, so no change at first.
however, on mac, we shadow toolchain.prf, and make it load() sdk.prf
first.
a side effect, it has become harder to disable the use of an sdk
altogether: putting CONFIG-=sdk into a project file or the qmake
command line has no effect now. instead, it's possible to put it into
.qmake.{conf,cache}.
to make it simpler again, it's conceivable to finally add qmake -pre,
which would allow setting variables before default_pre.prf is executed.
take 2: there was nothing wrong with the original patch, but in 5.8,
CONFIG+=simulator_and_device moved from qconfig.pri to various prf files
that would do it according to the simulator_and_device configure
feature, which would be way too late for the "pulled ahead" sdk.prf
loading. as simulator_and_device is now gone entirely, it is safe to
re-apply this patch (mostly) as-is.
Task-number: QTBUG-56144
Change-Id: I6cf484982eaed8af39f7a539c60f5a087a299914
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2016-10-14 11:14:13 +00:00
|
|
|
}
|
|
|
|
}
|
Fix detection of QMAKE_DEFAULT_LIBDIRS with Clang under Linux
With 4183475080d334d7d17d02e6ad4eb53c01205c54, Qt fails to build if
qmake is unable to detect the compiler's default include and
library search paths. Clang on non-Darwin systems was missing working
code for the detection.
Unlike GCC, Clang on its own does not print the library search paths
when called with the -v option.
On Darwin, the -Wl,-v option will reach ld64, which will print those paths.
However, neither GNU ld nor gold will print anything useful with just
-v. GNU ld has a --verbose option that does print some search paths, but
those are not the ones used when ld is invoked (via collect2) by GCC or
Clang, so it can't be used.
To make Clang print its library search paths one can use
-print-search-dirs, which however doesn't print include search paths. So
amend the existing code in order to make a second call to clang on
non-Darwin systems. This second call is used for library path detection,
and fixes the build on non-Darwin (tested on Linux).
Change-Id: Ic858f908ee1a2e0eb307abb074daee0ded38abd5
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
2017-07-03 22:56:38 +00:00
|
|
|
!darwin:clang {
|
|
|
|
# Clang on a non-Apple system (that is, a system without ld64 -- say, with GNU ld
|
|
|
|
# or gold under Linux) will not print any library search path. Need to use another
|
|
|
|
# invocation with different options (which in turn doesn't print include search
|
|
|
|
# paths, so it can't just be used in place of the above code).
|
|
|
|
# What's more, -print-search-dirs can't be used on clang on Apple because it
|
|
|
|
# won't print all the library paths (only the clang-internal ones).
|
|
|
|
output = $$system("$$cmd_prefix $$QMAKE_CXX -print-search-dirs", lines, ec)
|
2017-08-04 09:01:25 +00:00
|
|
|
!equals(ec, 0): qtCompilerErrror($$QMAKE_CXX)
|
Fix detection of QMAKE_DEFAULT_LIBDIRS with Clang under Linux
With 4183475080d334d7d17d02e6ad4eb53c01205c54, Qt fails to build if
qmake is unable to detect the compiler's default include and
library search paths. Clang on non-Darwin systems was missing working
code for the detection.
Unlike GCC, Clang on its own does not print the library search paths
when called with the -v option.
On Darwin, the -Wl,-v option will reach ld64, which will print those paths.
However, neither GNU ld nor gold will print anything useful with just
-v. GNU ld has a --verbose option that does print some search paths, but
those are not the ones used when ld is invoked (via collect2) by GCC or
Clang, so it can't be used.
To make Clang print its library search paths one can use
-print-search-dirs, which however doesn't print include search paths. So
amend the existing code in order to make a second call to clang on
non-Darwin systems. This second call is used for library path detection,
and fixes the build on non-Darwin (tested on Linux).
Change-Id: Ic858f908ee1a2e0eb307abb074daee0ded38abd5
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
2017-07-03 22:56:38 +00:00
|
|
|
|
|
|
|
for (line, output) {
|
|
|
|
contains(line, "^libraries: .*") {
|
|
|
|
line ~= s,^libraries: ,,
|
|
|
|
paths = $$split(line, $$QMAKE_DIRLIST_SEP)
|
|
|
|
for (path, paths): \
|
|
|
|
QMAKE_DEFAULT_LIBDIRS += $$clean_path($$replace(path, ^=, $$[SYSROOT]))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2017-05-24 11:02:16 +00:00
|
|
|
isEmpty(QMAKE_DEFAULT_LIBDIRS)|isEmpty(QMAKE_DEFAULT_INCDIRS): \
|
2017-06-06 19:34:56 +00:00
|
|
|
!integrity: \
|
2017-05-24 11:02:16 +00:00
|
|
|
error("failed to parse default search paths from compiler output")
|
fix QMAKE_DEFAULT_*DIRS resolution with apple SDK, take 2
the code got factored out to an own toolchain.prf file, which is
load()ed from default_pre.prf, so no change at first.
however, on mac, we shadow toolchain.prf, and make it load() sdk.prf
first.
a side effect, it has become harder to disable the use of an sdk
altogether: putting CONFIG-=sdk into a project file or the qmake
command line has no effect now. instead, it's possible to put it into
.qmake.{conf,cache}.
to make it simpler again, it's conceivable to finally add qmake -pre,
which would allow setting variables before default_pre.prf is executed.
take 2: there was nothing wrong with the original patch, but in 5.8,
CONFIG+=simulator_and_device moved from qconfig.pri to various prf files
that would do it according to the simulator_and_device configure
feature, which would be way too late for the "pulled ahead" sdk.prf
loading. as simulator_and_device is now gone entirely, it is safe to
re-apply this patch (mostly) as-is.
Task-number: QTBUG-56144
Change-Id: I6cf484982eaed8af39f7a539c60f5a087a299914
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2016-10-14 11:14:13 +00:00
|
|
|
QMAKE_DEFAULT_LIBDIRS = $$unique(QMAKE_DEFAULT_LIBDIRS)
|
|
|
|
} else: msvc {
|
determine QMAKE_DEFAULT_{INC,LIB}DIRS separately for host and target
note that in principle this leaves room for a race condition, as the
first project to determine the host config is not going to be the
top-level one.
in qtbase and qtdeclarative, this is naturally serialized via the common
bootstrapped libraries (bootstrap resp. qmldevtools). activeqt, qt3d,
qtscxml, and qtwayland all build only one bootstrapped tool each.
qtwebengine makes a fake host build to create files for gyp/gn; the
convert_dict tool is declared a host tool, but isn't actually built when
x-building anyway, and even if, it's serialized on the former. qttools
needs explicit serialization, though. no other host builds exist within
qt as of now.
Task-number: QTBUG-58126
Change-Id: I81a02a2d98f2bfe5d6aaa51119d5e7919549f119
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2017-01-12 19:52:51 +00:00
|
|
|
# This doesn't differentiate between host and target,
|
|
|
|
# but neither do the compilers.
|
fix QMAKE_DEFAULT_*DIRS resolution with apple SDK, take 2
the code got factored out to an own toolchain.prf file, which is
load()ed from default_pre.prf, so no change at first.
however, on mac, we shadow toolchain.prf, and make it load() sdk.prf
first.
a side effect, it has become harder to disable the use of an sdk
altogether: putting CONFIG-=sdk into a project file or the qmake
command line has no effect now. instead, it's possible to put it into
.qmake.{conf,cache}.
to make it simpler again, it's conceivable to finally add qmake -pre,
which would allow setting variables before default_pre.prf is executed.
take 2: there was nothing wrong with the original patch, but in 5.8,
CONFIG+=simulator_and_device moved from qconfig.pri to various prf files
that would do it according to the simulator_and_device configure
feature, which would be way too late for the "pulled ahead" sdk.prf
loading. as simulator_and_device is now gone entirely, it is safe to
re-apply this patch (mostly) as-is.
Task-number: QTBUG-56144
Change-Id: I6cf484982eaed8af39f7a539c60f5a087a299914
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2016-10-14 11:14:13 +00:00
|
|
|
LIB = $$getenv("LIB")
|
|
|
|
QMAKE_DEFAULT_LIBDIRS = $$split(LIB, $$QMAKE_DIRLIST_SEP)
|
|
|
|
INCLUDE = $$getenv("INCLUDE")
|
|
|
|
QMAKE_DEFAULT_INCDIRS = $$split(INCLUDE, $$QMAKE_DIRLIST_SEP)
|
|
|
|
}
|
|
|
|
|
|
|
|
unix {
|
|
|
|
isEmpty(QMAKE_DEFAULT_INCDIRS): QMAKE_DEFAULT_INCDIRS = /usr/include /usr/local/include
|
|
|
|
isEmpty(QMAKE_DEFAULT_LIBDIRS): QMAKE_DEFAULT_LIBDIRS = /lib /usr/lib
|
|
|
|
}
|
|
|
|
|
determine QMAKE_DEFAULT_{INC,LIB}DIRS separately for host and target
note that in principle this leaves room for a race condition, as the
first project to determine the host config is not going to be the
top-level one.
in qtbase and qtdeclarative, this is naturally serialized via the common
bootstrapped libraries (bootstrap resp. qmldevtools). activeqt, qt3d,
qtscxml, and qtwayland all build only one bootstrapped tool each.
qtwebengine makes a fake host build to create files for gyp/gn; the
convert_dict tool is declared a host tool, but isn't actually built when
x-building anyway, and even if, it's serialized on the former. qttools
needs explicit serialization, though. no other host builds exist within
qt as of now.
Task-number: QTBUG-58126
Change-Id: I81a02a2d98f2bfe5d6aaa51119d5e7919549f119
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
2017-01-12 19:52:51 +00:00
|
|
|
cache($${target_prefix}.INCDIRS, set stash, QMAKE_DEFAULT_INCDIRS)
|
|
|
|
cache($${target_prefix}.LIBDIRS, set stash, QMAKE_DEFAULT_LIBDIRS)
|
|
|
|
} else {
|
|
|
|
QMAKE_DEFAULT_INCDIRS = $$eval($${target_prefix}.INCDIRS)
|
|
|
|
QMAKE_DEFAULT_LIBDIRS = $$eval($${target_prefix}.LIBDIRS)
|
fix QMAKE_DEFAULT_*DIRS resolution with apple SDK, take 2
the code got factored out to an own toolchain.prf file, which is
load()ed from default_pre.prf, so no change at first.
however, on mac, we shadow toolchain.prf, and make it load() sdk.prf
first.
a side effect, it has become harder to disable the use of an sdk
altogether: putting CONFIG-=sdk into a project file or the qmake
command line has no effect now. instead, it's possible to put it into
.qmake.{conf,cache}.
to make it simpler again, it's conceivable to finally add qmake -pre,
which would allow setting variables before default_pre.prf is executed.
take 2: there was nothing wrong with the original patch, but in 5.8,
CONFIG+=simulator_and_device moved from qconfig.pri to various prf files
that would do it according to the simulator_and_device configure
feature, which would be way too late for the "pulled ahead" sdk.prf
loading. as simulator_and_device is now gone entirely, it is safe to
re-apply this patch (mostly) as-is.
Task-number: QTBUG-56144
Change-Id: I6cf484982eaed8af39f7a539c60f5a087a299914
Reviewed-by: Jake Petroules <jake.petroules@qt.io>
2016-10-14 11:14:13 +00:00
|
|
|
}
|
2016-12-15 15:20:27 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# Determine and cache the compiler version
|
|
|
|
#
|
|
|
|
|
|
|
|
defineReplace(qtVariablesFromMSVC) {
|
2017-06-08 12:39:05 +00:00
|
|
|
ret = $$system("$$1 -nologo -E $$2 $$system_quote($$PWD/data/macros.cpp) <NUL 2>NUL", lines, ec)
|
2017-08-04 09:01:25 +00:00
|
|
|
!equals(ec, 0): qtCompilerErrror($$1)
|
2017-06-08 12:39:05 +00:00
|
|
|
return($$ret)
|
2016-12-15 15:20:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
defineReplace(qtVariablesFromGCC) {
|
|
|
|
null_device = /dev/null
|
|
|
|
equals(QMAKE_HOST.os, Windows): null_device = NUL
|
2017-06-08 12:39:05 +00:00
|
|
|
ret = $$system("$$1 -E $$system_quote($$PWD/data/macros.cpp) <$$null_device 2>$$null_device", lines, ec)
|
2017-08-04 09:01:25 +00:00
|
|
|
!equals(ec, 0): qtCompilerErrror($$1)
|
2017-06-08 12:39:05 +00:00
|
|
|
return($$ret)
|
2016-12-15 15:20:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
isEmpty($${target_prefix}.COMPILER_MACROS) {
|
|
|
|
msvc {
|
2016-11-16 13:10:29 +00:00
|
|
|
clang_cl {
|
|
|
|
# We need to obtain the cl.exe version first
|
|
|
|
vars = $$qtVariablesFromMSVC(cl)
|
|
|
|
for (v, vars) {
|
|
|
|
isEmpty(v)|contains(v, $${LITERAL_HASH}.*): next()
|
|
|
|
eval($$v)
|
|
|
|
}
|
|
|
|
isEmpty(QMAKE_MSC_FULL_VER): error("Could not determine the Visual Studio version")
|
|
|
|
|
|
|
|
QMAKE_CFLAGS_MSVC_COMPAT = $$replace(QMAKE_MSC_FULL_VER, "(..)(..)(.*)", \
|
|
|
|
"-fms-compatibility-version=\\1.\\2.\\3")
|
|
|
|
cache($${target_prefix}.QMAKE_CFLAGS_MSVC_COMPAT, set stash, QMAKE_CFLAGS_MSVC_COMPAT)
|
|
|
|
$${target_prefix}.COMPILER_MACROS += QMAKE_CFLAGS_MSVC_COMPAT
|
|
|
|
vars = $$qtVariablesFromMSVC($$QMAKE_CXX, $$QMAKE_CFLAGS_MSVC_COMPAT)
|
|
|
|
} else {
|
|
|
|
vars = $$qtVariablesFromMSVC($$QMAKE_CXX)
|
|
|
|
}
|
2016-12-15 15:20:27 +00:00
|
|
|
} else: gcc {
|
|
|
|
vars = $$qtVariablesFromGCC($$QMAKE_CXX)
|
|
|
|
}
|
|
|
|
for (v, vars) {
|
|
|
|
isEmpty(v)|contains(v, $${LITERAL_HASH}.*): next()
|
|
|
|
# Set both <varname> for the outer scope ...
|
|
|
|
eval($$v)
|
|
|
|
v ~= s/ .*//
|
|
|
|
isEmpty($$v): error("Compiler produced empty value for $${v}.")
|
|
|
|
# ... and save QMAKE_(HOST_)?CXX.<varname> 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.
|
2017-03-04 17:33:35 +00:00
|
|
|
QMAKE_COMPILER_DEFINES += __cplusplus=$$QT_COMPILER_STDCXX
|
2017-06-08 12:30:33 +00:00
|
|
|
!isEmpty(QMAKE_MSC_VER): \
|
2016-12-15 15:20:27 +00:00
|
|
|
QMAKE_COMPILER_DEFINES += _MSC_VER=$$QMAKE_MSC_VER _MSC_FULL_VER=$$QMAKE_MSC_FULL_VER
|
2017-06-08 12:30:33 +00:00
|
|
|
!isEmpty(QMAKE_ICC_VER): \
|
2016-12-15 15:20:27 +00:00
|
|
|
QMAKE_COMPILER_DEFINES += __INTEL_COMPILER=$$QMAKE_ICC_VER __INTEL_COMPILER_UPDATE=$$QMAKE_ICC_UPDATE_VER
|
|
|
|
!isEmpty(QMAKE_APPLE_CC): \
|
|
|
|
QMAKE_COMPILER_DEFINES += __APPLE_CC__=$$QMAKE_APPLE_CC
|
2017-09-14 11:25:27 +00:00
|
|
|
!isEmpty(QMAKE_APPLE_CLANG_MAJOR_VERSION): \
|
2016-12-15 15:20:27 +00:00
|
|
|
QMAKE_COMPILER_DEFINES += __clang__ \
|
2017-06-08 12:30:33 +00:00
|
|
|
__clang_major__=$$QMAKE_APPLE_CLANG_MAJOR_VERSION \
|
|
|
|
__clang_minor__=$$QMAKE_APPLE_CLANG_MINOR_VERSION \
|
|
|
|
__clang_patchlevel__=$$QMAKE_APPLE_CLANG_PATCH_VERSION
|
2017-09-14 11:25:27 +00:00
|
|
|
!isEmpty(QMAKE_CLANG_MAJOR_VERSION): \
|
2016-12-15 15:20:27 +00:00
|
|
|
QMAKE_COMPILER_DEFINES += __clang__ \
|
2017-06-08 12:30:33 +00:00
|
|
|
__clang_major__=$$QMAKE_CLANG_MAJOR_VERSION \
|
|
|
|
__clang_minor__=$$QMAKE_CLANG_MINOR_VERSION \
|
|
|
|
__clang_patchlevel__=$$QMAKE_CLANG_PATCH_VERSION
|
2017-09-14 11:25:27 +00:00
|
|
|
!isEmpty(QMAKE_GCC_MAJOR_VERSION): \
|
2016-12-15 15:20:27 +00:00
|
|
|
QMAKE_COMPILER_DEFINES += \
|
2017-06-08 12:30:33 +00:00
|
|
|
__GNUC__=$$QMAKE_GCC_MAJOR_VERSION \
|
|
|
|
__GNUC_MINOR__=$$QMAKE_GCC_MINOR_VERSION \
|
|
|
|
__GNUC_PATCHLEVEL__=$$QMAKE_GCC_PATCH_VERSION
|
2016-11-16 13:10:29 +00:00
|
|
|
|
|
|
|
QMAKE_CFLAGS += $$QMAKE_CFLAGS_MSVC_COMPAT
|
|
|
|
QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_MSVC_COMPAT
|
2017-01-17 16:10:21 +00:00
|
|
|
|
|
|
|
msvc:!intel_icl:!clang_cl: include(../common/msvc-version.conf)
|