diff options
Diffstat (limited to 'mkspecs/features')
22 files changed, 268 insertions, 124 deletions
diff --git a/mkspecs/features/data/headersclean/tst_headersclean.cpp.in b/mkspecs/features/data/headersclean/tst_headersclean.cpp.in index 3cbcdd72c1..14655a2f98 100644 --- a/mkspecs/features/data/headersclean/tst_headersclean.cpp.in +++ b/mkspecs/features/data/headersclean/tst_headersclean.cpp.in @@ -1,40 +1,32 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/mkspecs/features/link_ltcg.prf b/mkspecs/features/link_ltcg.prf index 537021f11b..734743ca13 100644 --- a/mkspecs/features/link_ltcg.prf +++ b/mkspecs/features/link_ltcg.prf @@ -1,4 +1,9 @@ gcc { + !clang:!intel_icc:greaterThan(QMAKE_HOST.cpu_count, 1) { + # Override LTO number of jobs + QMAKE_LFLAGS_LTCG ~= s/^-flto$/-flto=$$QMAKE_HOST.cpu_count/ + } + # When doing link-time code generation, we need to pass the compiler # flags during linking the stage too. This file is processed after # default_post.prf, so the QMAKE_CXXFLAGS already contains diff --git a/mkspecs/features/ltcg.prf b/mkspecs/features/ltcg.prf index b0765a85c3..ccf0226272 100644 --- a/mkspecs/features/ltcg.prf +++ b/mkspecs/features/ltcg.prf @@ -1,38 +1,32 @@ CONFIG(release, debug|release) { # We need fat object files when creating static libraries on some platforms # so the linker will know to load a particular object from the library - # in the first place. With GCC, we have -ffat-lto-objects. MSVC - # seems to work just fine. For other compilers, we disable LTCG + # in the first place. On others, we have special ar and nm to create the symbol + # tables so the linker will know better. For other compilers, we disable LTCG # for static libraries. msvc { # Nothing to do - } else: gcc { - !clang:!intel_icc { - static|fat-lto { - QMAKE_CFLAGS_LTCG += -ffat-lto-objects - QMAKE_CXXFLAGS_LTCG += -ffat-lto-objects - } else { - QMAKE_CFLAGS_LTCG += -fno-fat-lto-objects - QMAKE_CXXFLAGS_LTCG += -fno-fat-lto-objects - } - linux { - # Get the number of online processors, like _SC_NPROCESSORS_ONLN - isEmpty(QMAKE_NPROCESSORS_ONLN) { - QMAKE_NPROCESSORS_ONLN = $$system("grep -c '^processor' /proc/cpuinfo 2>/dev/null || echo 1") - cache(QMAKE_NPROCESSORS_ONLN, set stash) - } + } else { + !isEmpty(QMAKE_AR_LTCG): QMAKE_AR = $$QMAKE_AR_LTCG + !isEmpty(QMAKE_NM_LTCG): QMAKE_NM = $$QMAKE_NM_LTCG - # Override LTO number of jobs - QMAKE_LFLAGS_LTCG -= -flto - QMAKE_LFLAGS_LTCG += -flto=$$QMAKE_NPROCESSORS_ONLN - } - } else: static { + equals(QMAKE_RANLIB_LTCG, true): QMAKE_RANLIB = + else: !isEmpty(QMAKE_RANLIB_LTCG): QMAKE_RANLIB = $$QMAKE_RANLIB_LTCG + + static:isEmpty(QMAKE_AR_LTCG):isEmpty(QMAKE_RANLIB_LTCG) { + # We don't know how to create symbol tables for static libs with this + # compiler, so disable LTCG QMAKE_CFLAGS_LTCG = QMAKE_CXXFLAGS_LTCG = QMAKE_LFLAGS_LTCG = } } + fat-lto { + QMAKE_CFLAGS_LTCG += $$QMAKE_CFLAGS_LTCG_FATOBJECTS + QMAKE_CXXFLAGS_LTCG += $$QMAKE_CXXFLAGS_LTCG_FATOBJECTS + } + load(link_ltcg) QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG diff --git a/mkspecs/features/mac/sdk.prf b/mkspecs/features/mac/sdk.prf index d2e698894f..e238f8e005 100644 --- a/mkspecs/features/mac/sdk.prf +++ b/mkspecs/features/mac/sdk.prf @@ -13,6 +13,14 @@ isEmpty(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.path) { QMAKE_MAC_SDK_PATH = $$eval(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.path) } +isEmpty(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.platform_path) { + QMAKE_MAC_SDK_PLATFORM_PATH = $$system("/usr/bin/xcodebuild -sdk $$QMAKE_MAC_SDK -version PlatformPath 2>/dev/null") + isEmpty(QMAKE_MAC_SDK_PLATFORM_PATH): error("Could not resolve SDK platform path for \'$$QMAKE_MAC_SDK\'") + cache(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.platform_path, set stash, QMAKE_MAC_SDK_PLATFORM_PATH) +} else { + QMAKE_MAC_SDK_PLATFORM_PATH = $$eval(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.platform_path) +} + isEmpty(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.version) { QMAKE_MAC_SDK_VERSION = $$system("/usr/bin/xcodebuild -sdk $$QMAKE_MAC_SDK -version SDKVersion 2>/dev/null") isEmpty(QMAKE_MAC_SDK_VERSION): error("Could not resolve SDK version for \'$$QMAKE_MAC_SDK\'") diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf index eb65e73079..6a66b76305 100644 --- a/mkspecs/features/qt_common.prf +++ b/mkspecs/features/qt_common.prf @@ -24,16 +24,19 @@ contains(TEMPLATE, .*lib) { rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]* else: \ rplbase = $$MODULE_BASE_OUTDIR - host_build: \ + host_build { + qqt_libdir = \$\$\$\$[QT_HOST_LIBS] qt_libdir = $$[QT_HOST_LIBS] - else: \ - qt_libdir = $$[QT_INSTALL_LIBS/raw] + } else { + qqt_libdir = \$\$\$\$[QT_INSTALL_LIBS] + qt_libdir = $$[QT_INSTALL_LIBS] + } contains(QMAKE_DEFAULT_LIBDIRS, $$qt_libdir) { lib_replace.match = "[^ ']*$$rplbase/lib" lib_replace.replace = } else { lib_replace.match = $$rplbase/lib - lib_replace.replace = $$qt_libdir + lib_replace.replace = $$qqt_libdir } lib_replace.CONFIG = path QMAKE_PRL_INSTALL_REPLACE += lib_replace diff --git a/mkspecs/features/qt_config.prf b/mkspecs/features/qt_config.prf index 208681d98a..973a2182c9 100644 --- a/mkspecs/features/qt_config.prf +++ b/mkspecs/features/qt_config.prf @@ -5,16 +5,21 @@ QMAKE_QT_CONFIG = $$[QT_HOST_DATA/get]/mkspecs/qconfig.pri debug(1, "Cannot load qconfig.pri!") } else { debug(1, "Loaded .qconfig.pri from ($$QMAKE_QT_CONFIG)") - QMAKE_MODULE_PATH = $$split($$list($$(QMAKEMODULES)), $$DIRLIST_SEPARATOR) + dirs = $$(QMAKEMODULES) + QMAKE_MODULE_PATH = $$split(dirs, $$DIRLIST_SEPARATOR) QMAKE_MODULE_PATH += $$QMAKEMODULES - QMAKE_MODULE_PATH += $$split($$list($$[QMAKEMODULES]), $$DIRLIST_SEPARATOR) - QMAKE_MODULE_PATH += $$replace($$list($$split($$list($$[QMAKE_MKSPECS]), $$DIRLIST_SEPARATOR)), \ - \$, /modules) + dirs = $$[QMAKEMODULES] + QMAKE_MODULE_PATH += $$split(dirs, $$DIRLIST_SEPARATOR) + dirs = $$[QMAKE_MKSPECS] + dirs = $$split(dirs, $$DIRLIST_SEPARATOR) + QMAKE_MODULE_PATH += $$replace(dirs, \$, /modules) + unset(dirs) QMAKE_MODULE_PATH = $$unique(QMAKE_MODULE_PATH) QMAKE_MODULE_PATH = $$reverse(QMAKE_MODULE_PATH) for(dir, QMAKE_MODULE_PATH) { debug(1, "Loading modules from $${dir}") - for(mod, $$list($$files($$dir/qt_*.pri))) { + mods = $$files($$dir/qt_*.pri) + for (mod, mods) { # For installed Qt these paths will be common for all modules. # For uninstalled prefix builds these will vary per module, via the # forwarding module pri files. Keep qt_module_pris.prf in sync with this! @@ -28,6 +33,7 @@ QMAKE_QT_CONFIG = $$[QT_HOST_DATA/get]/mkspecs/qconfig.pri QT_MODULE_QML_BASE = $$[QT_INSTALL_QML] include($$mod) } + unset(mods) } QT_MODULES = $$unique(QT_MODULES) # In case modules appear in multiple places unset(QT_MODULE_INCLUDE_BASE) diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf index 79b4eab949..78be2e8473 100644 --- a/mkspecs/features/qt_functions.prf +++ b/mkspecs/features/qt_functions.prf @@ -86,7 +86,7 @@ defineTest(qtAddModule) { unset(LINKAGE) mac:contains(MODULE_CONFIG, lib_bundle) { FRAMEWORK_INCLUDE = $${MODULE_LIBS}/$${MODULE_NAME}.framework/Headers - !qt_no_framework_direct_includes:exists($$FRAMEWORK_INCLUDE) { + !qt_no_framework_direct_includes { INCLUDEPATH *= $$FRAMEWORK_INCLUDE } contains(MODULE_CONFIG, internal_module): \ @@ -238,11 +238,12 @@ defineTest(qtAddToolEnv) { equals(ds, /) { contains($${env}.CONFIG, prepend): infix = \${$$name:+:\$$$name} else: infix = - val = "$$name=$$join(value, :)$$infix" + val = "$$name=$$shell_quote($$join(value, :))$$infix" } else { # Escape closing parens when expanding the variable, otherwise cmd confuses itself. contains($${env}.CONFIG, prepend): infix = ;%$$name:)=^)% else: infix = + value ~= s,\\),^),g val = "(set $$name=$$join(value, ;)$$infix) &" } isEmpty(3): !contains(TEMPLATE, vc.*) { @@ -272,6 +273,8 @@ defineTest(qtAddTargetEnv) { deppath.name = PATH } else:contains(QMAKE_HOST.os, Linux|FreeBSD|OpenBSD|NetBSD|DragonFly|SunOS|HP-UX|QNX|GNU) { deppath.name = LD_LIBRARY_PATH + } else:contains(QMAKE_HOST.os, Haiku) { + deppath.name = LIBRARY_PATH } else:equals(QMAKE_HOST.os, Darwin) { contains(QT_CONFIG, qt_framework): \ deppath.name = DYLD_FRAMEWORK_PATH @@ -308,15 +311,11 @@ defineReplace(pkgConfigExecutable) { isEmpty(PKG_CONFIG) { PKG_CONFIG = pkg-config - !isEmpty(PKG_CONFIG_SYSROOT_DIR) { - win32:isEmpty(MINGW_IN_SHELL):PKG_CONFIG = set PKG_CONFIG_SYSROOT_DIR=$$PKG_CONFIG_SYSROOT_DIR& $$PKG_CONFIG - else:PKG_CONFIG = PKG_CONFIG_SYSROOT_DIR=\"$$PKG_CONFIG_SYSROOT_DIR\" $$PKG_CONFIG - } - - !isEmpty(PKG_CONFIG_LIBDIR) { - win32:isEmpty(MINGW_IN_SHELL):PKG_CONFIG = set PKG_CONFIG_LIBDIR=$$PKG_CONFIG_LIBDIR& $$PKG_CONFIG - else:PKG_CONFIG = PKG_CONFIG_LIBDIR=\"$$PKG_CONFIG_LIBDIR\" $$PKG_CONFIG - } + sysroot.name = PKG_CONFIG_SYSROOT_DIR + sysroot.value = $$PKG_CONFIG_SYSROOT_DIR + libdir.name = PKG_CONFIG_LIBDIR + libdir.value = $$PKG_CONFIG_LIBDIR + qtAddToolEnv(PKG_CONFIG, sysroot libdir, SYS) } equals(QMAKE_HOST.os, Windows): \ diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf index 2437efef88..b85dbfb9c3 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf @@ -181,7 +181,10 @@ load(qt_common) unix|mingw { CONFIG += create_pc QMAKE_PKGCONFIG_DESTDIR = pkgconfig - QMAKE_PKGCONFIG_LIBDIR = $$qt_libdir + host_build: \ + QMAKE_PKGCONFIG_LIBDIR = $$[QT_HOST_LIBS] + else: \ + QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS/raw] QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS/raw] QMAKE_PKGCONFIG_CFLAGS = -I${includedir}/$$MODULE_INCNAME QMAKE_PKGCONFIG_NAME = $$replace(TARGET, ^Qt, "Qt$$QT_MAJOR_VERSION ") @@ -190,12 +193,23 @@ unix|mingw { QMAKE_PKGCONFIG_REQUIRES += $$replace(QT.$${i}.name, ^Qt, Qt$$eval(QT.$${i}.MAJOR_VERSION)) isEmpty(QMAKE_PKGCONFIG_DESCRIPTION): \ QMAKE_PKGCONFIG_DESCRIPTION = $$replace(TARGET, ^Qt, "Qt ") module - QMAKE_PKGCONFIG_INSTALL_REPLACE += lib_replace + pclib_replace.match = $$lib_replace.match + !isEmpty(lib_replace.replace): \ + pclib_replace.replace = $$QMAKE_PKGCONFIG_LIBDIR + pclib_replace.CONFIG = path + QMAKE_PKGCONFIG_INSTALL_REPLACE += pclib_replace unix { CONFIG += create_libtool explicitlib - QMAKE_LIBTOOL_LIBDIR = $$qt_libdir - QMAKE_LIBTOOL_INSTALL_REPLACE += lib_replace + host_build: \ + QMAKE_LIBTOOL_LIBDIR = $$[QT_HOST_LIBS] + else: \ + QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS/raw]" + ltlib_replace.match = $$lib_replace.match + !isEmpty(lib_replace.replace): \ + ltlib_replace.replace = $$QMAKE_LIBTOOL_LIBDIR + ltlib_replace.CONFIG = path + QMAKE_LIBTOOL_INSTALL_REPLACE += ltlib_replace } } diff --git a/mkspecs/features/qt_module_headers.prf b/mkspecs/features/qt_module_headers.prf index 5015d58861..fc3ec75e82 100644 --- a/mkspecs/features/qt_module_headers.prf +++ b/mkspecs/features/qt_module_headers.prf @@ -21,7 +21,7 @@ load(qt_build_paths) QMAKE_SYNCQT += -module $$MODULE_INCNAME -version $$VERSION } QMAKE_SYNCQT += \ - -outdir $$MODULE_BASE_OUTDIR $$MODULE_SYNCQT_DIR + -outdir $$system_quote($$MODULE_BASE_OUTDIR) $$MODULE_SYNCQT_DIR !silent: message($$QMAKE_SYNCQT) system($$QMAKE_SYNCQT)|error("Failed to run: $$QMAKE_SYNCQT") } diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf index 03a8e5db71..b40e1391ac 100644 --- a/mkspecs/features/qt_module_pris.prf +++ b/mkspecs/features/qt_module_pris.prf @@ -48,9 +48,10 @@ MODULE_FWD_PRI = $$mod_work_pfx/qt_lib_$${MODULE_ID}.pri module_libs = "\$\$QT_MODULE_LIB_BASE" unix:!static { host_build: \ - module_rpath = "QT.$${MODULE_ID}.rpath = $$[QT_HOST_LIBS]" + module_rpath = $$[QT_HOST_LIBS] else: \ - module_rpath = "QT.$${MODULE_ID}.rpath = $$[QT_INSTALL_LIBS/raw]" + module_rpath = $$[QT_INSTALL_LIBS/dev] + module_rpath = "QT.$${MODULE_ID}.rpath = $$val_escape(module_rpath)" } else { module_rpath = } @@ -58,7 +59,9 @@ MODULE_FWD_PRI = $$mod_work_pfx/qt_lib_$${MODULE_ID}.pri module_rundep = "QT.$${MODULE_ID}.run_depends = $$replace(QT_PRIVATE, -private$, _private)" else: \ module_rundep = - static: \ + equals(TEMPLATE, aux): \ + module_build_type = no_link + else:static: \ module_build_type = staticlib else:mac:contains(QT_CONFIG, qt_framework): \ module_build_type = lib_bundle @@ -93,7 +96,7 @@ MODULE_FWD_PRI = $$mod_work_pfx/qt_lib_$${MODULE_ID}.pri internal_module: \ MODULE_INCLUDES += $$MODULE_PRIVATE_INCLUDES split_incpath: \ - MODULE_FWD_PRI_CONT_SUFFIX += "QT.$${MODULE_ID}.includes += $$MODULE_SHADOW_INCLUDES" + MODULE_FWD_PRI_CONT_SUFFIX += "QT.$${MODULE_ID}.includes += $$val_escape(MODULE_SHADOW_INCLUDES)" MODULE_PRI_CONT = \ "QT.$${MODULE_ID}.VERSION = $${VERSION}" \ "QT.$${MODULE_ID}.MAJOR_VERSION = $$section(VERSION, ., 0, 0)" \ @@ -117,11 +120,11 @@ MODULE_FWD_PRI = $$mod_work_pfx/qt_lib_$${MODULE_ID}.pri $$module_rundep \ "QT.$${MODULE_ID}.module_config =$$join(module_build_type, " ", " ")" \ $$module_config \ - "QT.$${MODULE_ID}.DEFINES = $$MODULE_DEFINES" \ # assume sufficient quoting + "QT.$${MODULE_ID}.DEFINES = $$val_escape(MODULE_DEFINES)" \ "" \ "QT_MODULES += $$MODULE" write_file($$MODULE_PRI, MODULE_PRI_CONT)|error("Aborting.") - !internal_module { + !internal_module:!no_private_module { module_build_type += internal_module no_link MODULE_PRIVATE_PRI_CONT = \ "QT.$${MODULE}_private.VERSION = $${VERSION}" \ @@ -147,18 +150,18 @@ MODULE_FWD_PRI = $$mod_work_pfx/qt_lib_$${MODULE_ID}.pri # Create a forwarding module .pri file MODULE_FWD_PRI_CONT = \ - "QT_MODULE_BIN_BASE = $$MODULE_BASE_OUTDIR/bin" \ - "QT_MODULE_INCLUDE_BASE = $$MODULE_BASE_INCDIR/include" \ - "QT_MODULE_IMPORT_BASE = $$MODULE_BASE_OUTDIR/imports" \ - "QT_MODULE_QML_BASE = $$MODULE_BASE_OUTDIR/qml" \ - "QT_MODULE_LIB_BASE = $$MODULE_BASE_OUTDIR/lib" \ - "QT_MODULE_HOST_LIB_BASE = $$MODULE_BASE_OUTDIR/lib" \ - "QT_MODULE_LIBEXEC_BASE = $$MODULE_BASE_OUTDIR/libexec" \ - "QT_MODULE_PLUGIN_BASE = $$MODULE_BASE_OUTDIR/plugins" \ - "include($$MODULE_PRI)" \ + "QT_MODULE_BIN_BASE = $$val_escape(MODULE_BASE_OUTDIR)/bin" \ + "QT_MODULE_INCLUDE_BASE = $$val_escape(MODULE_BASE_INCDIR)/include" \ + "QT_MODULE_IMPORT_BASE = $$val_escape(MODULE_BASE_OUTDIR)/imports" \ + "QT_MODULE_QML_BASE = $$val_escape(MODULE_BASE_OUTDIR)/qml" \ + "QT_MODULE_LIB_BASE = $$val_escape(MODULE_BASE_OUTDIR)/lib" \ + "QT_MODULE_HOST_LIB_BASE = $$val_escape(MODULE_BASE_OUTDIR)/lib" \ + "QT_MODULE_LIBEXEC_BASE = $$val_escape(MODULE_BASE_OUTDIR)/libexec" \ + "QT_MODULE_PLUGIN_BASE = $$val_escape(MODULE_BASE_OUTDIR)/plugins" \ + "include($$val_escape(MODULE_PRI))" \ "QT.$${MODULE_ID}.priority = 1" - !internal_module: MODULE_FWD_PRI_CONT += \ - "include($$MODULE_PRIVATE_PRI)" \ + !internal_module:!no_private_module: MODULE_FWD_PRI_CONT += \ + "include($$val_escape(MODULE_PRIVATE_PRI))" \ "QT.$${MODULE}_private.priority = 1" MODULE_FWD_PRI_CONT += $$MODULE_FWD_PRI_CONT_SUFFIX write_file($$MODULE_FWD_PRI, MODULE_FWD_PRI_CONT)|error("Aborting.") diff --git a/mkspecs/features/qt_targets.prf b/mkspecs/features/qt_targets.prf index 02bf20b222..72429526a7 100644 --- a/mkspecs/features/qt_targets.prf +++ b/mkspecs/features/qt_targets.prf @@ -1,4 +1,4 @@ -QMAKE_TARGET_COMPANY = Digia Plc and/or its subsidiary(-ies) +QMAKE_TARGET_COMPANY = The Qt Company Ltd QMAKE_TARGET_PRODUCT = Qt5 QMAKE_TARGET_DESCRIPTION = C++ application development framework. -QMAKE_TARGET_COPYRIGHT = Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +QMAKE_TARGET_COPYRIGHT = Copyright (C) 2015 The Qt Company Ltd. diff --git a/mkspecs/features/sanitizer.prf b/mkspecs/features/sanitizer.prf new file mode 100644 index 0000000000..9e7ff0218a --- /dev/null +++ b/mkspecs/features/sanitizer.prf @@ -0,0 +1,30 @@ +# Sanitizer flags + + +sanitize_address { + QMAKE_CFLAGS += $$QMAKE_SANITIZE_ADDRESS_CFLAGS + QMAKE_CXXFLAGS += $$QMAKE_SANITIZE_ADDRESS_CXXFLAGS + QMAKE_LFLAGS += $$QMAKE_SANITIZE_ADDRESS_LFLAGS +} + +sanitize_memory { + QMAKE_CFLAGS += $$QMAKE_SANITIZE_MEMORY_CFLAGS + QMAKE_CXXFLAGS += $$QMAKE_SANITIZE_MEMORY_CXXFLAGS + QMAKE_LFLAGS += $$QMAKE_SANITIZE_MEMORY_LFLAGS +} + +sanitize_thread { + QMAKE_CFLAGS += $$QMAKE_SANITIZE_THREAD_CFLAGS + QMAKE_CXXFLAGS += $$QMAKE_SANITIZE_THREAD_CXXFLAGS + QMAKE_LFLAGS += $$QMAKE_SANITIZE_THREAD_LFLAGS +} + +sanitize_undefined { + QMAKE_CFLAGS += $$QMAKE_SANITIZE_UNDEFINED_CFLAGS + QMAKE_CXXFLAGS += $$QMAKE_SANITIZE_UNDEFINED_CXXFLAGS + QMAKE_LFLAGS += $$QMAKE_SANITIZE_UNDEFINED_LFLAGS +} + +QMAKE_CFLAGS += $$QMAKE_COMMON_SANITIZE_CFLAGS +QMAKE_CXXFLAGS += $$QMAKE_COMMON_SANITIZE_CXXFLAGS + diff --git a/mkspecs/features/simd.prf b/mkspecs/features/simd.prf index 7d9eaffafa..700d79a1b5 100644 --- a/mkspecs/features/simd.prf +++ b/mkspecs/features/simd.prf @@ -27,6 +27,7 @@ defineTest(addSimdCompiler) { CONFIG($$1) { cflags = $$eval(QMAKE_CFLAGS_$${upname}) + ltcg: cflags += $$QMAKE_CFLAGS_DISABLE_LTCG contains(QT_CPU_FEATURES, $$name) { # Default compiler settings include this feature, so just add to SOURCES SOURCES += $$eval($$sources_var) diff --git a/mkspecs/features/spec_post.prf b/mkspecs/features/spec_post.prf index ad03c9c428..c9578773fe 100644 --- a/mkspecs/features/spec_post.prf +++ b/mkspecs/features/spec_post.prf @@ -13,14 +13,12 @@ isEmpty(QMAKE_PLATFORM) { else: \ TARGET_PLATFORM = unix } else:if(equals(MAKEFILE_GENERATOR, MSVC.NET) \ - |equals(MAKEFILE_GENERATOR, BMAKE) \ |equals(MAKEFILE_GENERATOR, MSBUILD) \ |equals(MAKEFILE_GENERATOR, MINGW)) { TARGET_PLATFORM = win32 } else:if(equals(MAKEFILE_GENERATOR, PROJECTBUILDER) \ |equals(MAKEFILE_GENERATOR, XCODE)) { - } else:equals(MAKEFILE_GENERATOR, GBUILD) { - TARGET_PLATFORM = unix + TARGET_PLATFORM = macx } else { error("Qmake spec sets an invalid MAKEFILE_GENERATOR.") } @@ -56,3 +54,65 @@ isEmpty(QMAKE_COMPILER) { warning("qmake spec does not announce the compiler family. Guessed $${QMAKE_COMPILER}.") } CONFIG += $$QMAKE_COMPILER + +equals(MAKEFILE_GENERATOR, MSBUILD) \ +|equals(MAKEFILE_GENERATOR, MSVC.NET) \ +|isEmpty(QMAKE_SH) { + QMAKE_ZIP = zip -r -9 + + QMAKE_COPY = copy /y + QMAKE_COPY_FILE = $$QMAKE_COPY + QMAKE_COPY_DIR = xcopy /s /q /y /i + # xcopy copies the contained files if source is a directory. Deal with it. + CONFIG += copy_dir_files + QMAKE_MOVE = move + QMAKE_DEL_FILE = del + QMAKE_DEL_DIR = rmdir + QMAKE_DEL_TREE = rmdir /s /q + QMAKE_CHK_EXISTS = if not exist %1 + QMAKE_CHK_DIR_EXISTS = if not exist # legacy + QMAKE_MKDIR = mkdir # legacy + QMAKE_MKDIR_CMD = if not exist %1 mkdir %1 & if not exist %1 exit 1 + QMAKE_STREAM_EDITOR = $(QMAKE) -install sed + QMAKE_INSTALL_FILE = copy /y + QMAKE_INSTALL_PROGRAM = copy /y +} else { + QMAKE_TAR = tar -cf + QMAKE_GZIP = gzip -9f + + QMAKE_COPY = cp -f + QMAKE_COPY_FILE = $$QMAKE_COPY + QMAKE_COPY_DIR = $$QMAKE_COPY -R + QMAKE_MOVE = mv -f + QMAKE_DEL_FILE = rm -f + QMAKE_DEL_DIR = rmdir + QMAKE_DEL_TREE = rm -rf + QMAKE_CHK_EXISTS = test -e %1 || + QMAKE_CHK_DIR_EXISTS = test -d # legacy + QMAKE_MKDIR = mkdir -p # legacy + QMAKE_MKDIR_CMD = test -d %1 || mkdir -p %1 + QMAKE_STREAM_EDITOR = sed + + equals(QMAKE_HOST.os, Windows) { + MINGW_IN_SHELL = 1 # legacy + # Override built-ins. + QMAKE_DIR_SEP = / + QMAKE_DIRLIST_SEP = : + # Because install's ability to set permissions is not relevant on Windows, + # and git's msys does not provide it to start with. + QMAKE_INSTALL_FILE = cp -f + QMAKE_INSTALL_PROGRAM = cp -f + } else { + QMAKE_INSTALL_FILE = install -m 644 -p + QMAKE_INSTALL_PROGRAM = install -m 755 -p + } +} +QMAKE_INSTALL_DIR = $$QMAKE_COPY_DIR +equals(QMAKE_HOST.os, Windows) { + # Ugly (and broken for relative paths) hack to support cross-building for Unix. + QMAKE_SYMBOLIC_LINK = $$QMAKE_COPY + QMAKE_LN_SHLIB = $$QMAKE_SYMBOLIC_LINK +} else { + QMAKE_SYMBOLIC_LINK = ln -f -s + QMAKE_LN_SHLIB = ln -s +} diff --git a/mkspecs/features/static_runtime.prf b/mkspecs/features/static_runtime.prf new file mode 100644 index 0000000000..3275e6e2e2 --- /dev/null +++ b/mkspecs/features/static_runtime.prf @@ -0,0 +1,7 @@ +msvc { + # -MD becomes -MT, -MDd becomes -MTd + QMAKE_CFLAGS ~= s,^-MD(d?)$, -MT\1,g + QMAKE_CXXFLAGS ~= s,^-MD(d?)$, -MT\1,g +} else: mingw { + QMAKE_LFLAGS += -static +} diff --git a/mkspecs/features/testcase.prf b/mkspecs/features/testcase.prf index 770afa3386..a6ef930128 100644 --- a/mkspecs/features/testcase.prf +++ b/mkspecs/features/testcase.prf @@ -52,25 +52,18 @@ insignificant_test:check.commands = -$${check.commands} QMAKE_EXTRA_TARGETS *= check -!debug_and_release|build_pass { +isEmpty(BUILDS)|build_pass { check.depends = first } else { + # For exclusive builds, only run the test once. check.CONFIG = recursive - # In debug and release mode, only run the test once. - # Run debug if that is the preferred config, release otherwise. - debug_and_release { - check.target = dummy_check - check.recurse_target = check - CONFIG(debug, debug|release) { - real_check.depends = debug-check - real_check.target = check - QMAKE_EXTRA_TARGETS += real_check - } else { - real_check.depends = release-check - real_check.target = check - QMAKE_EXTRA_TARGETS += real_check - } - } + check.target = check_all + check.recurse_target = check + check.commands = + + check_first.depends = $$eval($$first(BUILDS).target)-check + check_first.target = check + QMAKE_EXTRA_TARGETS += check_first } !no_testcase_installs:!contains(INSTALLS, target) { @@ -187,5 +180,11 @@ contains(INSTALLS, target) { } } +macx-xcode:bundle:isEmpty(QMAKE_BUNDLE_EXTENSION) { + QMAKE_PBX_PRODUCT_TYPE = com.apple.product-type.bundle.unit-test + QMAKE_PBX_BUNDLE_TYPE = wrapper.cfbundle + QMAKE_BUNDLE_EXTENSION = .xctest +} + } # have_target diff --git a/mkspecs/features/testlib_defines.prf b/mkspecs/features/testlib_defines.prf index 59540689d3..9176beb9dd 100644 --- a/mkspecs/features/testlib_defines.prf +++ b/mkspecs/features/testlib_defines.prf @@ -1 +1 @@ -DEFINES += QT_TESTCASE_BUILDDIR=\\\"$$OUT_PWD\\\" +DEFINES += QT_TESTCASE_BUILDDIR=$$shell_quote(\"$$OUT_PWD\") diff --git a/mkspecs/features/unix/separate_debug_info.prf b/mkspecs/features/unix/separate_debug_info.prf index 394d5f42bc..7d9022f8d7 100644 --- a/mkspecs/features/unix/separate_debug_info.prf +++ b/mkspecs/features/unix/separate_debug_info.prf @@ -9,19 +9,21 @@ have_target:!static:!isEmpty(QMAKE_OBJCOPY) { debug_info_keep = --only-keep-debug debug_info_strip = --strip-debug } - QMAKE_SEPARATE_DEBUG_INFO = test -z \"$(DESTDIR)\" || cd \"$(DESTDIR)\" ; targ=`basename $(TARGET)`; $$QMAKE_OBJCOPY $$debug_info_keep \"\$\$targ\" \"\$\$targ.$$debug_info_suffix\" && $$QMAKE_OBJCOPY $$debug_info_strip \"\$\$targ\" && $$QMAKE_OBJCOPY --add-gnu-debuglink=\"\$\$targ.$$debug_info_suffix\" \"\$\$targ\" && chmod -x \"\$\$targ.$$debug_info_suffix\" - QMAKE_INSTALL_SEPARATE_DEBUG_INFO = test -z \"$(DESTDIR)\" || cd \"$(DESTDIR)\" ; $(INSTALL_FILE) `basename $(TARGET)`.$$debug_info_suffix $(INSTALL_ROOT)/\$\$target_path/ + load(resolve_target) + QMAKE_TARGET_DEBUG_INFO = $${QMAKE_RESOLVED_TARGET}.$$debug_info_suffix + + shell_target = $$shell_quote($$relative_path($$QMAKE_RESOLVED_TARGET, $$OUT_PWD)) + shell_target_debug_info = $$shell_quote($$relative_path($$QMAKE_TARGET_DEBUG_INFO, $$OUT_PWD)) + copy_debug_info = $$QMAKE_OBJCOPY $$debug_info_keep $$shell_target $$shell_target_debug_info + strip_debug_info = $$QMAKE_OBJCOPY $$debug_info_strip $$shell_target + link_debug_info = $$QMAKE_OBJCOPY --add-gnu-debuglink=$$shell_target_debug_info $$shell_target + chmod_debug_info = chmod -x $$shell_target_debug_info !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK - QMAKE_POST_LINK = $$QMAKE_SEPARATE_DEBUG_INFO $$QMAKE_POST_LINK + QMAKE_POST_LINK = $$copy_debug_info && $$strip_debug_info && $$link_debug_info && $$chmod_debug_info $$QMAKE_POST_LINK silent:QMAKE_POST_LINK = @echo creating $@.$$debug_info_suffix && $$QMAKE_POST_LINK - isEmpty(DESTDIR) { - target.targets += "`basename $(TARGET)`.$$debug_info_suffix" - QMAKE_DISTCLEAN += "`basename $(TARGET)`.$$debug_info_suffix" - } else { - target.targets += "$(DESTDIR)/`basename $(TARGET)`.$$debug_info_suffix" - QMAKE_DISTCLEAN += "$(DESTDIR)/`basename $(TARGET)`.$$debug_info_suffix" - } + target.targets += $$QMAKE_TARGET_DEBUG_INFO + QMAKE_DISTCLEAN += $$QMAKE_TARGET_DEBUG_INFO } diff --git a/mkspecs/features/win32/dumpcpp.prf b/mkspecs/features/win32/dumpcpp.prf index af6387bed6..3da54fb66d 100644 --- a/mkspecs/features/win32/dumpcpp.prf +++ b/mkspecs/features/win32/dumpcpp.prf @@ -11,7 +11,7 @@ dumpcpp_decl.CONFIG += no_link QMAKE_EXTRA_COMPILERS += dumpcpp_decl -dumpcpp_impl.commands = $$QMAKE_DUMPCPP -donothing +dumpcpp_impl.commands = $$escape_expand(\\n) # dummy command dumpcpp_impl.output = ${QMAKE_FILE_BASE}.cpp dumpcpp_impl.input = TYPELIBS dumpcpp_impl.variable_out = SOURCES diff --git a/mkspecs/features/win32/idcidl.prf b/mkspecs/features/win32/idcidl.prf index 85e4cb9c5f..a688b3ff41 100644 --- a/mkspecs/features/win32/idcidl.prf +++ b/mkspecs/features/win32/idcidl.prf @@ -13,7 +13,7 @@ qtPrepareTool(QMAKE_IDC, idc) contains(TEMPLATE, "vc.*") { ACTIVEQT_IDC = $${QMAKE_IDC} ACTIVEQT_IDL = $${QMAKE_IDL} - ACTIVEQT_TARGET = "$(TargetPath)" + ACTIVEQT_TARGET = \"$(TargetPath)\" win32-msvc { ACTIVEQT_NEWLINE = $$escape_expand(\\t) ACTIVEQT_OUTPUT = $(IntDir)/$${TARGET} @@ -21,7 +21,7 @@ contains(TEMPLATE, "vc.*") { ACTIVEQT_NEWLINE = $$escape_expand(\\n\\t) ACTIVEQT_OUTPUT = $(IntDir)$${TARGET} } - ACTIVEQT_TLBOUT = "$(TargetDir)/$${TARGET}.tlb" + ACTIVEQT_TLBOUT = \"$(TargetDir)/$${TARGET}.tlb\" GENERATED += $${OBJECTS_DIR}/$${TARGET}.idl $${ACTIVEQT_TLBOUT} } else { ACTIVEQT_IDC = -$(IDC) @@ -46,7 +46,8 @@ contains(TEMPLATE, "vc.*") { QMAKE_POST_LINK += $$quote($$ACTIVEQT_IDL "$${ACTIVEQT_OUTPUT}.idl" /nologo /tlb "$${ACTIVEQT_TLBOUT}"$$ACTIVEQT_NEWLINE) message("No rc-file linked into project; type library will be a separate file.") } - QMAKE_POST_LINK += $$quote($$ACTIVEQT_IDC $${ACTIVEQT_TARGET} /regserver) + !qaxserver_no_register: \ + QMAKE_POST_LINK += $$quote($$ACTIVEQT_IDC $${ACTIVEQT_TARGET} /regserver) QMAKE_CLEAN += $${ACTIVEQT_OUTPUT}.idl $${ACTIVEQT_OUTPUT}.tlb } diff --git a/mkspecs/features/winrt/package_manifest.prf b/mkspecs/features/winrt/package_manifest.prf index 2ccb5db963..7e5effa438 100644 --- a/mkspecs/features/winrt/package_manifest.prf +++ b/mkspecs/features/winrt/package_manifest.prf @@ -71,7 +71,9 @@ exists($$UUID_CACHE) { include($$UUID_CACHE) } else { - WINRT_UUID = "WINRT_MANIFEST.identity = $$system(uuidgen)" + WINRT_UUID = $$system(uuidgen) + isEmpty(WINRT_UUID): error("Unable to generate a UUID. Make sure uuidgen is in your PATH.") + WINRT_UUID = "WINRT_MANIFEST.identity = $$WINRT_UUID" write_file($$UUID_CACHE, WINRT_UUID)|error("Unable to write the UUID cache; aborting.") eval($$WINRT_UUID) } @@ -137,6 +139,18 @@ ICONS_FOUND ~= s/.*\\\$\\\$\\{WINRT_MANIFEST\\.((logo|tile)_[^\}]+)\\}.*/\\1/g for (ICON_NAME, ICONS_FOUND) { ICON_FILE = $$eval(WINRT_MANIFEST.$$ICON_NAME) + isEmpty(ICON_FILE) { + equals(ICON_NAME, "logo_310x150"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_wide) + else: equals(ICON_NAME, "logo_150x150"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_large) + # Windows Phone specifics + else: equals(ICON_NAME, "logo_480x800"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_splash) + else: equals(ICON_NAME, "logo_71x71"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_medium) + else: equals(ICON_NAME, "logo_44x44"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_small) + # Windows RT specifics + else: equals(ICON_NAME, "logo_620x300"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_splash) + else: equals(ICON_NAME, "logo_70x70"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_medium) + else: equals(ICON_NAME, "logo_30x30"): ICON_FILE = $$eval(WINRT_MANIFEST.logo_small) + } isEmpty(ICON_FILE): ICON_FILE = $$WINRT_ASSETS_PATH/$${ICON_NAME}.png icon_$${ICON_NAME}.input = $$ICON_FILE icon_$${ICON_NAME}.output = $$BUILD_DIR/assets/$$basename(ICON_FILE) diff --git a/mkspecs/features/xctest.prf b/mkspecs/features/xctest.prf new file mode 100644 index 0000000000..4b84682df7 --- /dev/null +++ b/mkspecs/features/xctest.prf @@ -0,0 +1,6 @@ +equals(TEMPLATE, app) { + load(sdk) + # Make the XCTest framework available. This is normally handled automatically + # by Xcode based on heuristics, but we need to explicitly link to XCTest. + QMAKE_LFLAGS += -F$${QMAKE_MAC_SDK_PLATFORM_PATH}/Developer/Library/Frameworks -weak_framework XCTest +} |