6fa5dfddf8
Normal sources are built using $(CXX), which is defined in the makefile, but can be overridden. We should do the same lazy evaluation of the compiler for headers. Change-Id: Ic548786bd18ed8fb7eb0b58a527615ab19000323 Reviewed-by: Kai Koehne <kai.koehne@qt.io>
314 lines
13 KiB
Plaintext
314 lines
13 KiB
Plaintext
#
|
|
# W A R N I N G
|
|
# -------------
|
|
#
|
|
# This file is not part of the Qt API. It exists purely as an
|
|
# implementation detail. It may change from version to version
|
|
# without notice, or even be removed.
|
|
#
|
|
# We mean it.
|
|
#
|
|
|
|
load(qt_build_paths)
|
|
|
|
!build_pass:git_build {
|
|
qtPrepareTool(QMAKE_SYNCQT, syncqt, , system)
|
|
minimal_syncqt {
|
|
QMAKE_SYNCQT += -minimal $$QMAKE_SYNCQT_OPTIONS
|
|
} else {
|
|
qtConfig(private_tests): \ # -developer-build
|
|
QMAKE_SYNCQT += -check-includes
|
|
}
|
|
for(mod, MODULE_INCNAME): \
|
|
QMAKE_SYNCQT += -module $$mod
|
|
QMAKE_SYNCQT += \
|
|
-version $$VERSION -outdir $$system_quote($$MODULE_BASE_OUTDIR) \
|
|
-builddir $$system_quote($$REAL_MODULE_BASE_OUTDIR) $$MODULE_SYNCQT_DIR
|
|
!silent: message($$QMAKE_SYNCQT)
|
|
system($$QMAKE_SYNCQT)|error("Failed to run: $$QMAKE_SYNCQT")
|
|
|
|
!minimal_syncqt {
|
|
include-distclean.commands = \
|
|
$$QMAKE_DEL_TREE $$shell_quote($$shell_path($$MODULE_BASE_OUTDIR/include/$$MODULE_INCNAME))
|
|
QMAKE_EXTRA_TARGETS += include-distclean
|
|
DISTCLEAN_DEPS += include-distclean
|
|
}
|
|
}
|
|
|
|
# Pre-generated headers in the source tree (tar-ball) and
|
|
# - shadow build or
|
|
# - non-shadow non-prefix build of a module which is not qtbase
|
|
# (because the build-time generated headers all end up in qtbase).
|
|
!git_build: \
|
|
if(!equals(_PRO_FILE_PWD_, $$OUT_PWD) \
|
|
|if(!prefix_build:!equals(MODULE_BASE_INDIR, $$[QT_HOST_PREFIX]))): \
|
|
CONFIG += split_incpath
|
|
|
|
# To avoid stuffing the code with repetetive conditionals,
|
|
# we parametrize the names of the variables we assign to.
|
|
|
|
# Internal modules have no private part - they *are* private.
|
|
!internal_module: \
|
|
prv = _PRIVATE
|
|
|
|
# When doing a framework build with a prefix, the module needs to point
|
|
# into the frameworks' Headers dirs directly, as no shared include/ dir
|
|
# is installed.
|
|
# However, during the build, it needs to point into the shared include/
|
|
# dir, as the framework doesn't even exist yet. For bootstrapped modules
|
|
# which borrow headers from "proper" modules, this situation persists
|
|
# even beyond the module's own build. The implication of this is that
|
|
# qmake might never use a framework's headers in a non-prefix build,
|
|
# as there is no separate set of .pri files for users outside Qt.
|
|
# Borrowing is assumed to happen from modules which, in a framework build,
|
|
# actually are frameworks.
|
|
prefix_build:module_frameworks: \
|
|
fwd = _FWD
|
|
# When using a split include path during the build, the installed module's
|
|
# include path is also structurally different from that in the build dir.
|
|
prefix_build:split_incpath: \
|
|
sfwd = _FWD
|
|
|
|
ibase = \$\$QT_MODULE_INCLUDE_BASE
|
|
MODULE$${fwd}_INCLUDES = $$ibase
|
|
split_incpath {
|
|
bibase = $$val_escape(MODULE_BASE_OUTDIR)/include
|
|
MODULE$${sfwd}_INCLUDES += $$bibase
|
|
}
|
|
for(mod, MODULE_INCNAME) {
|
|
mibase = $$ibase/$$mod
|
|
MODULE$${fwd}_INCLUDES += $$mibase
|
|
MODULE$${fwd}$${prv}_INCLUDES += $$mibase/$$VERSION $$mibase/$$VERSION/$$mod
|
|
split_incpath {
|
|
mbibase = $$bibase/$$mod
|
|
MODULE$${sfwd}_INCLUDES += $$mbibase
|
|
generated_privates: \
|
|
MODULE$${sfwd}$${prv}_INCLUDES += $$mbibase/$$VERSION $$mbibase/$$VERSION/$$mod
|
|
}
|
|
prefix_build:module_frameworks {
|
|
mfbase = \$\$QT_MODULE_LIB_BASE/$${mod}.framework/Headers
|
|
MODULE_INCLUDES += $$mfbase
|
|
MODULE$${prv}_INCLUDES += $$mfbase/$$VERSION $$mfbase/$$VERSION/$$mod
|
|
}
|
|
}
|
|
MODULE_INCLUDES += $$MODULE_AUX_INCLUDES
|
|
MODULE_PRIVATE_INCLUDES += $$MODULE_PRIVATE_AUX_INCLUDES
|
|
|
|
minimal_syncqt: return()
|
|
|
|
defineTest(syncQtResolve) {
|
|
out =
|
|
for (f, SYNCQT.$$1): \
|
|
out += $$absolute_path($$f, $$2)
|
|
SYNCQT.$$1 = $$out
|
|
export(SYNCQT.$$1)
|
|
}
|
|
|
|
#load up the headers info
|
|
git_build: \
|
|
INC_PATH = $$MODULE_BASE_OUTDIR
|
|
else: \
|
|
INC_PATH = $$MODULE_BASE_INDIR
|
|
include($$INC_PATH/include/$$MODULE_INCNAME/headers.pri, "", true)
|
|
syncQtResolve(HEADER_FILES, $$_PRO_FILE_PWD_)
|
|
syncQtResolve(PRIVATE_HEADER_FILES, $$_PRO_FILE_PWD_)
|
|
syncQtResolve(QPA_HEADER_FILES, $$_PRO_FILE_PWD_)
|
|
syncQtResolve(GENERATED_HEADER_FILES, $$INC_PATH/include/$$MODULE_INCNAME)
|
|
!lib_bundle: \ # Headers are embedded into the bundle, so don't install them separately.
|
|
CONFIG += qt_install_headers
|
|
|
|
alien_syncqt: return()
|
|
|
|
MODULE_INC_OUTDIR = $$MODULE_BASE_OUTDIR/include/$$MODULE_INCNAME
|
|
|
|
isEmpty(MODULE_CFG_FILE): MODULE_CFG_FILE = qt$${MODULE}-config
|
|
exists($$OUT_PWD/$${MODULE_CFG_FILE}.h) {
|
|
fwd_rel = $$relative_path($$OUT_PWD, $$REAL_MODULE_BASE_OUTDIR)
|
|
SYNCQT.INJECTIONS += \
|
|
$$fwd_rel/$${MODULE_CFG_FILE}.h:$${MODULE_CFG_FILE}.h \
|
|
$$fwd_rel/$${MODULE_CFG_FILE}_p.h:$$MODULE_VERSION/$$MODULE_INCNAME/private/$${MODULE_CFG_FILE}_p.h
|
|
}
|
|
|
|
for (injection, SYNCQT.INJECTIONS) {
|
|
injects = $$split(injection, :)
|
|
dst_hdr = $$absolute_path($$member(injects, 0), $$REAL_MODULE_BASE_OUTDIR)
|
|
ofwd_hdr = $$member(injects, 1)
|
|
fwd_hdr = $$replace(ofwd_hdr, ^\\^, )
|
|
MAIN_FWD = $$MODULE_INC_OUTDIR/$$fwd_hdr
|
|
MAIN_FWD_CONT = '$${LITERAL_HASH}include "$$relative_path($$dst_hdr, $$dirname(MAIN_FWD))"'
|
|
write_file($$MAIN_FWD, MAIN_FWD_CONT)|error()
|
|
equals(fwd_hdr, ofwd_hdr): touch($$MAIN_FWD, $$dst_hdr)
|
|
!git_build: QMAKE_DISTCLEAN += $$MAIN_FWD
|
|
!contains(ofwd_hdr, .*/private/.*): \
|
|
SYNCQT.INJECTED_HEADER_FILES += $$dst_hdr
|
|
else: \
|
|
SYNCQT.INJECTED_PRIVATE_HEADER_FILES += $$dst_hdr
|
|
injects = $$member(injects, 2, -1)
|
|
for (inject, injects) {
|
|
CLASS_FWD = $$MODULE_INC_OUTDIR/$$inject
|
|
CLASS_FWD_CONT = '$${LITERAL_HASH}include "$$fwd_hdr"'
|
|
write_file($$CLASS_FWD, CLASS_FWD_CONT)|error()
|
|
touch($$CLASS_FWD, $$MAIN_FWD)
|
|
!git_build: QMAKE_DISTCLEAN += $$CLASS_FWD
|
|
SYNCQT.INJECTED_HEADER_FILES += $$CLASS_FWD
|
|
}
|
|
}
|
|
|
|
autogen_warning = \
|
|
"/* This file was generated by qmake with the info from <root>/$$relative_path($$_PRO_FILE_, $$MODULE_BASE_INDIR). */"
|
|
|
|
# Create a module master depends header
|
|
MODULE_MASTER_DEPS_HEADER = $$MODULE_BASE_OUTDIR/include/$$MODULE_INCNAME/$${MODULE_INCNAME}Depends
|
|
!build_pass {
|
|
MODULE_MASTER_DEPS_HEADER_CONT = $$autogen_warning
|
|
MODULE_MASTER_DEPS_HEADER_CONT += "$${LITERAL_HASH}ifdef __cplusplus /* create empty PCH in C mode */"
|
|
for(dep, MODULE_DEPENDS) {
|
|
depname = $$eval(QT.$${dep}.master_header)
|
|
isEmpty(depname): \
|
|
depname = $$eval(QT.$${dep}.name)
|
|
MODULE_MASTER_DEPS_HEADER_CONT += "$${LITERAL_HASH}include <$$depname/$$depname>"
|
|
}
|
|
MODULE_MASTER_DEPS_HEADER_CONT += "$${LITERAL_HASH}endif"
|
|
write_file($$MODULE_MASTER_DEPS_HEADER, MODULE_MASTER_DEPS_HEADER_CONT)|error()
|
|
!git_build: QMAKE_DISTCLEAN += $$MODULE_MASTER_DEPS_HEADER
|
|
}
|
|
SYNCQT.HEADER_FILES += $$MODULE_MASTER_DEPS_HEADER
|
|
|
|
# Automatically enable precompiled headers for Qt modules with more than 2 sources
|
|
combined_SOURCES = $$SOURCES $$OBJECTIVE_SOURCES
|
|
count(combined_SOURCES, 2, >) {
|
|
# except for Gcc/Windows: Larger precompiled headers crash cc1plus.exe
|
|
# (e.g. with i686-4.8.2-release-posix-dwarf-rt_v3-rev3)
|
|
!if(gcc:equals(QMAKE_HOST.os, Windows)):!equals(TEMPLATE, aux) {
|
|
!defined(PRECOMPILED_HEADER, "var"): PRECOMPILED_HEADER = $$MODULE_MASTER_DEPS_HEADER
|
|
}
|
|
} else {
|
|
CONFIG -= precompile_header
|
|
}
|
|
unset(combined_SOURCES)
|
|
|
|
headersclean:!internal_module {
|
|
# Make sure that the header compiles with our strict options
|
|
hcleanDEFS = -DQT_NO_CAST_TO_ASCII=1 \
|
|
-DQT_NO_CAST_FROM_ASCII=1 \
|
|
-UQT_RESTRICTED_CAST_FROM_ASCII \
|
|
-DQT_STRICT_ITERATORS \
|
|
-DQT_NO_URL_CAST_FROM_STRING=1 \
|
|
-DQT_NO_CAST_FROM_BYTEARRAY=1 \
|
|
-DQT_NO_KEYWORDS=1 \
|
|
-DQT_USE_QSTRINGBUILDER \
|
|
-DQT_USE_FAST_OPERATOR_PLUS \
|
|
-Dsignals=int \
|
|
-Dslots=int \
|
|
-Demit=public: \
|
|
-Dforeach=public: \
|
|
-Dforever=public:
|
|
|
|
gcc:!rim_qcc {
|
|
# Turn on some extra warnings not found in -Wall -Wextra.
|
|
# Common to GCC, Clang and ICC (and other compilers that masquerade as GCC):
|
|
hcleanFLAGS = -Wall -Wextra -Werror \
|
|
-Woverloaded-virtual -Wshadow -Wundef -Wfloat-equal \
|
|
-Wnon-virtual-dtor -Wpointer-arith -Wformat-security \
|
|
-Wno-long-long -Wno-variadic-macros -pedantic-errors
|
|
|
|
intel_icc {
|
|
# these warnings are disabled because explicit constructors with zero or
|
|
# multiple arguments are permitted in C++11:
|
|
# 2304: non-explicit constructor with single argument may cause implicit type conversion
|
|
# 2305: declaration of 'explicit' constructor without a single argument is redundant
|
|
hcleanFLAGS += -wd2304,2305
|
|
greaterThan(QT_ICC_MAJOR_VERSION, 13) {
|
|
# ICC 14+ has a bug with -Wshadow, emitting it for cases where there's no shadowing
|
|
# (issue ID 0000698329, task DPD200245740)
|
|
hcleanFLAGS -= -Wshadow
|
|
}
|
|
} else {
|
|
# options accepted by GCC and Clang
|
|
hcleanFLAGS += -Wchar-subscripts -Wold-style-cast
|
|
|
|
!contains(QT_ARCH, arm):!contains(QT_ARCH, mips): \
|
|
hcleanFLAGS += -Wcast-align
|
|
|
|
clang_ver = $${QT_CLANG_MAJOR_VERSION}.$${QT_CLANG_MINOR_VERSION}
|
|
versionAtLeast(clang_ver, 3.8): hcleanFLAGS += -Wdouble-promotion
|
|
|
|
!clang {
|
|
# options accepted only by GCC
|
|
|
|
gcc_ver = $${QT_GCC_MAJOR_VERSION}.$${QT_GCC_MINOR_VERSION}
|
|
versionAtLeast(gcc_ver, 4.5): hcleanFLAGS += -Wdouble-promotion
|
|
versionAtLeast(gcc_ver, 4.9): hcleanFLAGS += -Wfloat-conversion
|
|
# GCC 9 has a lot of false positives relating to this, so disable completely
|
|
greaterThan(QT_GCC_MAJOR_VERSION, 8): hcleanFLAGS += -Wno-deprecated-copy
|
|
# GCC 9 introduced this
|
|
greaterThan(QT_GCC_MAJOR_VERSION, 8): hcleanFLAGS += -Wno-redundant-move
|
|
# GCC 9 introduced this
|
|
greaterThan(QT_GCC_MAJOR_VERSION, 8): hcleanFLAGS += -Wno-format-overflow
|
|
# GCC 9 introduced this
|
|
greaterThan(QT_GCC_MAJOR_VERSION, 8): hcleanFLAGS += -Wno-init-list-lifetime
|
|
|
|
c++11 {
|
|
# only enabled for actual c++11 builds due to
|
|
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52806
|
|
hcleanFLAGS += -Wzero-as-null-pointer-constant
|
|
}
|
|
}
|
|
}
|
|
|
|
# Use strict mode C++11 or C++98, with no GNU extensions (see -pedantic-errors above).
|
|
# The module might set CONFIG += c++11, but it might also change QMAKE_CXXFLAGS_CXX11
|
|
# or the module (or the mkspec) can set the C++11 flag on QMAKE_CXXFLAGS
|
|
# (or QMAKE_CXXFLAGS_{RELEASE,DEBUG} but that's unlikely).
|
|
c++11:contains(QMAKE_CXXFLAGS_CXX11, -std=gnu++11) {
|
|
hcleanFLAGS += -std=c++11
|
|
} else: contains(QMAKE_CXXFLAGS, -std=gnu++11) {
|
|
hcleanFLAGS += -std=c++11
|
|
} else: c++11:contains(QMAKE_CXXFLAGS_CXX11, -std=gnu++0x) {
|
|
hcleanFLAGS += -std=c++0x
|
|
} else: contains(QMAKE_CXXFLAGS, -std=gnu++0x) {
|
|
hcleanFLAGS += -std=c++0x
|
|
} else: !c++11:!contains(QMAKE_CXXFLAGS, -std=c++0x):!contains(QMAKE_CXXFLAGS, -std=c++11) {
|
|
hcleanFLAGS += -std=c++98
|
|
}
|
|
|
|
hcleanCOMMAND = $(CXX) -c $(CXXFLAGS) $$hcleanFLAGS $(INCPATH) $$hcleanDEFS -xc++ ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
|
|
} else: msvc:!intel_icl {
|
|
# 4180: qualifier applied to function type has no meaning; ignored
|
|
# 4458: declaration of 'identifier' hides class member
|
|
# -Za enables strict standards behavior, but we can't add it because
|
|
# <windows.h> and <GL.h> violate the standards.
|
|
hcleanFLAGS = -WX -W3 -wd4180 -wd4458
|
|
|
|
# MSVC 2015 (compiler version 19.0):
|
|
# 4577: 'noexcept' used with no exception handling mode specified; termination on exception is not guaranteed. Specify /EHsc
|
|
greaterThan(QMAKE_MSC_VER, 18): hcleanFLAGS += -wd4577
|
|
|
|
hcleanCOMMAND = $(CXX) -c $(CXXFLAGS) $$hcleanFLAGS $(INCPATH) $$hcleanDEFS -FI${QMAKE_FILE_IN} -Fo${QMAKE_FILE_OUT} \
|
|
$$[QT_INSTALL_DATA/src]/mkspecs/features/data/dummy.cpp
|
|
}
|
|
|
|
!isEmpty(hcleanCOMMAND):if(!qtConfig(debug_and_release)|CONFIG(release, debug|release)) {
|
|
CLEAN_HEADERS =
|
|
for (h, SYNCQT.CLEAN_HEADER_FILES) {
|
|
hh = $$split(h, :)
|
|
hr = $$member(hh, 1)
|
|
isEmpty(hr)|qtConfig($$hr): \
|
|
CLEAN_HEADERS += $$member(hh, 0)
|
|
}
|
|
CLEAN_HEADERS -= $$HEADERSCLEAN_EXCLUDE
|
|
header_check.dependency_type = TYPE_C
|
|
header_check.CONFIG += no_link
|
|
header_check.output = ${QMAKE_VAR_OBJECTS_DIR}header_${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
|
|
header_check.input = CLEAN_HEADERS
|
|
header_check.variable_out = PRE_TARGETDEPS
|
|
header_check.name = headercheck ${QMAKE_FILE_IN}
|
|
header_check.commands = $$hcleanCOMMAND
|
|
silent:header_check.commands = @echo compiling[header] ${QMAKE_FILE_IN} && $$hcleanCOMMAND
|
|
QMAKE_EXTRA_COMPILERS += header_check
|
|
}
|
|
unset(hcleanCOMMAND)
|
|
unset(hcleanFLAGS)
|
|
unset(hcleanDEFS)
|
|
}
|