diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-09-25 14:02:04 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2015-09-25 14:02:04 +0200 |
commit | a1ad9a74ebb3c556c5f70f7e03be68b09598ac53 (patch) | |
tree | 615a96db418219a57a745a5899e39a9ac90744ec /mkspecs/features | |
parent | 6d78b7a0c46ea04f4bb771d960e2f7dff1362341 (diff) | |
parent | 462f355e4fb16cc7a1838fa2dda0f763eee58c84 (diff) |
Merge remote-tracking branch 'origin/5.6' into dev
Conflicts:
src/corelib/io/io.pri
src/corelib/io/qdatastream.cpp
src/corelib/io/qdatastream.h
src/network/socket/qabstractsocket.cpp
src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
src/plugins/platforms/cocoa/qcocoaaccessibilityelement.h
src/widgets/styles/qgtkstyle.cpp
tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
tests/auto/dbus/qdbusconnection/qdbusconnection.pro
tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp
tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
Change-Id: I347549a024eb5bfa986699e0a11f96cc55c797a7
Diffstat (limited to 'mkspecs/features')
-rw-r--r-- | mkspecs/features/c++11.prf | 9 | ||||
-rw-r--r-- | mkspecs/features/c++14.prf | 23 | ||||
-rw-r--r-- | mkspecs/features/default_post.prf | 15 | ||||
-rw-r--r-- | mkspecs/features/device_config.prf | 9 | ||||
-rw-r--r-- | mkspecs/features/lex.prf | 2 | ||||
-rw-r--r-- | mkspecs/features/mac/default_post.prf | 40 | ||||
-rw-r--r-- | mkspecs/features/mac/sdk.prf | 3 | ||||
-rw-r--r-- | mkspecs/features/qt.prf | 160 | ||||
-rw-r--r-- | mkspecs/features/qt_app.prf | 1 | ||||
-rw-r--r-- | mkspecs/features/qt_common.prf | 14 | ||||
-rw-r--r-- | mkspecs/features/qt_example_installs.prf | 4 | ||||
-rw-r--r-- | mkspecs/features/qt_functions.prf | 145 | ||||
-rw-r--r-- | mkspecs/features/qt_module.prf | 24 | ||||
-rw-r--r-- | mkspecs/features/qt_module_pris.prf | 10 | ||||
-rw-r--r-- | mkspecs/features/qt_plugin.prf | 2 | ||||
-rw-r--r-- | mkspecs/features/winrt/default_pre.prf | 12 | ||||
-rw-r--r-- | mkspecs/features/winrt/package_manifest.prf | 17 | ||||
-rw-r--r-- | mkspecs/features/yacc.prf | 12 |
18 files changed, 236 insertions, 266 deletions
diff --git a/mkspecs/features/c++11.prf b/mkspecs/features/c++11.prf deleted file mode 100644 index c8a86548ee..0000000000 --- a/mkspecs/features/c++11.prf +++ /dev/null @@ -1,9 +0,0 @@ -strict_c++|isEmpty(QMAKE_CXXFLAGS_GNUCXX11) { - QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_CXX11 - QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CXXFLAGS_CXX11 - QMAKE_LFLAGS += $$QMAKE_LFLAGS_CXX11 -} else { - QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_GNUCXX11 - QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CXXFLAGS_GNUCXX11 - QMAKE_LFLAGS += $$QMAKE_LFLAGS_GNUCXX11 -} diff --git a/mkspecs/features/c++14.prf b/mkspecs/features/c++14.prf deleted file mode 100644 index 076458560d..0000000000 --- a/mkspecs/features/c++14.prf +++ /dev/null @@ -1,23 +0,0 @@ -intel_icc { - # ICC does not support C++14 yet -} else: clang { - # Clang has supported -std=c++1y since version 3.2 - greaterThan(QT_CLANG_MAJOR_VERSION, 3)|greaterThan(QT_CLANG_MINOR_VERSION, 1) { - QMAKE_CXXFLAGS_CXX11 = -std=c++1y - QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++1y - } - # Unknown how long Apple Clang has supported -std=c++1y, but at least since XCode 5.0 - greaterThan(QT_APPLE_CLANG_MAJOR_VERSION, 4) { - QMAKE_CXXFLAGS_CXX11 = -std=c++1y - QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++1y - } -} else: gcc { - # GCC has supported -std=c++1y since 4.8 - greaterThan(QT_GCC_MAJOR_VERSION, 4)|greaterThan(QT_GCC_MINOR_VERSION, 7) { - QMAKE_CXXFLAGS_CXX11 = -std=c++1y - QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++1y - } -} - -# Delegate to c++11.prf -include(c++11.prf) diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf index bcaddc8363..ebe83af25e 100644 --- a/mkspecs/features/default_post.prf +++ b/mkspecs/features/default_post.prf @@ -98,6 +98,21 @@ breakpad { !isEmpty(QMAKE_STRIP):QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote($$QMAKE_STRIP $$DEBUGFILENAME) } +c++11|c++14|c++1z { + c++1z: cxxstd = CXX1Z + else: c++14: cxxstd = CXX14 + else: cxxstd = CXX11 + + # Check if we should disable the GNU extensions or not + !strict_c++:!isEmpty(QMAKE_CXXFLAGS_GNU$$cxxstd): cxxstd = GNU$$cxxstd + + QMAKE_CXXFLAGS += $$eval(QMAKE_CXXFLAGS_$$cxxstd) + QMAKE_OBJECTIVE_CFLAGS += $$eval(QMAKE_CXXFLAGS_$$cxxstd) + QMAKE_LFLAGS += $$eval(QMAKE_LFLAGS_$$cxxstd) + + unset(cxxstd) +} + !precompile_header: SOURCES += $$NO_PCH_SOURCES QMAKE_INCDIR += $$QMAKE_INCDIR_POST diff --git a/mkspecs/features/device_config.prf b/mkspecs/features/device_config.prf index cd3a0cf8cd..e0383ef530 100644 --- a/mkspecs/features/device_config.prf +++ b/mkspecs/features/device_config.prf @@ -19,10 +19,15 @@ defineTest(deviceSanityCheckCompiler) { else: \ sfx = + # Build the compiler filename using the first value in QMAKE_CXX in order to + # support tools like ccache, which give QMAKE_CXX values of the form: + # ccache <path_to_compiler> + compiler = $$first(QMAKE_CXX)$$sfx + # Check if the binary exists with an absolute path. Do this check # before the CROSS_COMPILE empty check below to allow the mkspec # to derive the compiler path from other device options. - exists($$QMAKE_CXX$$sfx):return() + exists($$compiler):return() # Check for possible reasons of failure # check if CROSS_COMPILE device-option is set @@ -31,7 +36,7 @@ defineTest(deviceSanityCheckCompiler) { # Check if QMAKE_CXX points to an executable. ensurePathEnv() for (dir, QMAKE_PATH_ENV) { - exists($$dir/$${QMAKE_CXX}$$sfx): \ + exists($$dir/$${compiler}): \ return() } diff --git a/mkspecs/features/lex.prf b/mkspecs/features/lex.prf index 19ffe1932c..1ca9ae8afa 100644 --- a/mkspecs/features/lex.prf +++ b/mkspecs/features/lex.prf @@ -26,7 +26,7 @@ $(MOVE) $$intermediate_file ${QMAKE_FILE_OUT} $$escape_expand(\\n\\t) unset(intermediate_file) } - lex.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_lex$${first(QMAKE_EXT_CPP)} + lex.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_LEX}$${first(QMAKE_EXT_CPP)} silent:lex.commands = @echo Lex ${QMAKE_FILE_IN} && $$lex.commands QMAKE_EXTRA_COMPILERS += lex diff --git a/mkspecs/features/mac/default_post.prf b/mkspecs/features/mac/default_post.prf index b459389c72..30960e66dd 100644 --- a/mkspecs/features/mac/default_post.prf +++ b/mkspecs/features/mac/default_post.prf @@ -1,20 +1,7 @@ load(default_post) !no_objective_c:CONFIG += objective_c -qt:!isEmpty(QT_CONFIG) { - # Pick a suitable default architecture for qmake-based applications. - # If the Qt package contains one of x86 and x86_64, pick that one. If it - # contains both then use the compiler default. Make a similar decision for - # PowerPC-based systems. Note that this logic assumes that Qt has been - # configured with an architecture that is usable on the system. - contains(QMAKE_HOST.arch, ppc)|contains(QMAKE_HOST.arch, "Power Macintosh") { - !contains(QT_CONFIG, ppc64):contains(QT_CONFIG, ppc):CONFIG += ppc - contains(QT_CONFIG, ppc64):!contains(QT_CONFIG, ppc):CONFIG += ppc64 - } else { - !contains(QT_CONFIG, x86_64):contains(QT_CONFIG, x86):CONFIG += x86 - contains(QT_CONFIG, x86_64):!contains(QT_CONFIG, x86):CONFIG += x86_64 - } - +qt { contains(QT_CONFIG, static) { # C++11 support means using libc++ instead of libstd++. As the # two libraries are incompatible we need to ensure the end user @@ -35,31 +22,6 @@ qt:!isEmpty(QT_CONFIG) { QMAKE_LFLAGS += -stdlib=libstdc++ } } - # If Qt was built with shared libraries with rpath support and project does - # not specify own rpaths (including empty list) add one pointing to Qt - # libraries. This applies only to apps, since all loaded libraries inherit - # rpaths from current process executable. - else:!if(host_build:force_bootstrap):equals(TEMPLATE, app):!defined(QMAKE_RPATHDIR, var):contains(QT_CONFIG, rpath) { - # If app is expected to be installed into the Qt prefix build, use - # relative path, so all SDK tools and examples work when relocated. - prefix_build:defined(target.path, var):\ - contains(target.path, "$$re_escape($$[QT_INSTALL_PREFIX])/.*"):\ - # Tests are an exception, since they are launched in their build not - # install location by CI, so we cannot use relative rpaths there. - !contains(target.path, "$$re_escape($$[QT_INSTALL_TESTS])/.*") { - app_bundle { - ios: binpath = $$target.path/$${TARGET}.app - else: binpath = $$target.path/$${TARGET}.app/Contents/MacOS - } else { - binpath = $$target.path - } - QMAKE_RPATHDIR = @loader_path/$$relative_path($$[QT_INSTALL_LIBS], $$binpath) - unset(binpath) - } else { - # Otherwise, use absolute path to Qt libraries - QMAKE_RPATHDIR = $$[QT_INSTALL_LIBS] - } - } } macx-xcode:!isEmpty(QMAKE_XCODE_DEBUG_INFORMATION_FORMAT) { diff --git a/mkspecs/features/mac/sdk.prf b/mkspecs/features/mac/sdk.prf index e238f8e005..a5643e311d 100644 --- a/mkspecs/features/mac/sdk.prf +++ b/mkspecs/features/mac/sdk.prf @@ -72,9 +72,6 @@ isEmpty(QMAKE_MAC_SDK.$${QMAKE_MAC_SDK}.platform_name) { # FIXME: Get the version_min_flag out of the platform's 'Native Build System.xcspec' version_identifier = $$replace(QMAKE_MAC_PLATFORM_NAME, iphonesimulator, ios-simulator) - # C++11 support may affect the deployment target - c++11: load(c++11) - ios:!host_build: \ deployment_target = $$QMAKE_IOS_DEPLOYMENT_TARGET else: \ diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf index ce93105f4b..2e466ec9be 100644 --- a/mkspecs/features/qt.prf +++ b/mkspecs/features/qt.prf @@ -14,18 +14,6 @@ no_keywords:DEFINES += QT_NO_KEYWORDS plugin { #Qt plugins static:DEFINES += QT_STATICPLUGIN DEFINES += QT_PLUGIN - - # Triggers both on Qt being configured with -arch boundschecker, - # and if you qmake CONFIG+=boundchecker on your plugin project - boundschecker|contains(QT_CONFIG,boundschecker) { - # This option is added for plugins when Qt is configured for Boundschecker, - # since we want Boundschecker to not instrument the qt_plugin_query_verification_data - # function, as we call that function without the plugin's dependent DLLs, thus - # Boundscheckers instrumentation will fail. The function only returns a const char *, - # so no instrumentation is really needed on that function anyways. - QMAKE_CFLAGS += /nmignore:*:qt_plugin_query_verification_data - QMAKE_CXXFLAGS += /nmignore:*:qt_plugin_query_verification_data - } } qtestlib { @@ -57,23 +45,155 @@ qaxserver { QT += axserver } +# target variable, flag source variable +defineTest(qtProcessModuleFlags) { + for(flag, $$2) { + contains(flag, ^-.*): \ + $$1 -= $$replace(flag, ^-, ) + else: \ + $$1 += $$flag + } + export($$1) +} + unset(using_privates) -qtAddModules(QT, LIBS) -qtAddModules(QT_PRIVATE, LIBS_PRIVATE) +var_sfx = +for(ever) { + # qmake variables cannot contain dashes, so normalize the names first + CLEAN_QT$$var_sfx = $$replace(QT$$var_sfx, -private$, _private) + # Topological resolution of modules based on their QT.<module>.depends variable + FULL_QT$$var_sfx = $$resolve_depends(CLEAN_QT$$var_sfx, "QT.") + # Finally actually add the modules + unset(BAD_QT) + for(QTLIB, FULL_QT$$var_sfx) { + MODULE_NAME = $$eval(QT.$${QTLIB}.name) + MODULE_INCLUDES = $$eval(QT.$${QTLIB}.includes) + MODULE_LIBS = $$eval(QT.$${QTLIB}.libs) + MODULE_CONFIG = $$eval(QT.$${QTLIB}.module_config) + + isEmpty(MODULE_NAME) { + BAD_QT += $$QTLIB + next() + } + + target_qt:isEqual(TARGET, $$MODULE_NAME) { + warning("$$TARGET cannot have a QT$$var_sfx of $$QTLIB") + next() + } + + contains(MODULE_CONFIG, internal_module): \ + using_privates = true + contains(MODULE_CONFIG, ltcg): \ + CONFIG += link_ltcg + + qtProcessModuleFlags(CONFIG, QT.$${QTLIB}.CONFIG) + qtProcessModuleFlags(DEFINES, QT.$${QTLIB}.DEFINES) + + MODULE_INCLUDES -= $$QMAKE_DEFAULT_INCDIRS + MODULE_LIBS_ADD = $$MODULE_LIBS + MODULE_LIBS_ADD -= $$QMAKE_DEFAULT_LIBDIRS + + LINKAGE = + mac:contains(MODULE_CONFIG, lib_bundle) { + FRAMEWORK_INCLUDE = $${MODULE_LIBS}/$${MODULE_NAME}.framework/Headers + !qt_no_framework_direct_includes { + INCLUDEPATH *= $$FRAMEWORK_INCLUDE + } + contains(MODULE_CONFIG, internal_module): \ + INCLUDEPATH += \ + $$FRAMEWORK_INCLUDE/$$eval(QT.$${QTLIB}.VERSION) \ + $$FRAMEWORK_INCLUDE/$$eval(QT.$${QTLIB}.VERSION)/$$MODULE_NAME + QMAKE_FRAMEWORKPATH *= $${MODULE_LIBS} + !contains(MODULE_CONFIG, no_link): \ + LINKAGE += -framework $${MODULE_NAME}$${QT_LIBINFIX} + } else { + INCLUDEPATH *= $$MODULE_INCLUDES + } + + # Only link to this module if a libs directory is set, else this is just a module + # to give access to sources or include files, and not for linking. + !isEmpty(MODULE_LIBS):!contains(MODULE_CONFIG, no_link) { + + # Re-insert the major version in the library name (cf qt5LibraryTarget above) + # unless it's a framework build + !mac|!contains(MODULE_CONFIG, lib_bundle): \ + MODULE_NAME ~= s,^Qt,Qt$$QT_MAJOR_VERSION, + + win32 { + # Make sure the version number isn't appended again to the lib name + QMAKE_$${upper($$MODULE_NAME$$QT_LIBINFIX)}_VERSION_OVERRIDE = 0 + QMAKE_$${upper($$MODULE_NAME$$QT_LIBINFIX)}D_VERSION_OVERRIDE = 0 + } + + isEmpty(LINKAGE) { + !isEmpty(MODULE_LIBS_ADD): \ + LINKAGE = -L$$MODULE_LIBS_ADD + lib = $${MODULE_NAME}$${QT_LIBINFIX}$$qtPlatformTargetSuffix() + LINKAGE += -l$$lib + + contains(MODULE_CONFIG, staticlib): \ + PRE_TARGETDEPS *= $$MODULE_LIBS/$${QMAKE_PREFIX_STATICLIB}$${lib}.$${QMAKE_EXTENSION_STATICLIB} + } + + LIBS$$var_sfx += $$LINKAGE + + !isEmpty(QMAKE_LSB) { + !isEmpty(MODULE_LIBS_ADD): \ + QMAKE_LFLAGS *= --lsb-libpath=$$MODULE_LIBS_ADD + QMAKE_LFLAGS *= --lsb-shared-libs=$${MODULE_NAME}$${QT_LIBINFIX} + QMAKE_LIBDIR *= /opt/lsb/lib + } + } + } + !isEmpty(BAD_QT):error("Unknown module(s) in QT$$var_sfx: $$replace(BAD_QT, _private$, -private)") + + !isEmpty(var_sfx): break() + var_sfx = _PRIVATE +} !isEmpty(using_privates):!no_private_qt_headers_warning:if(!debug_and_release|!build_pass) { message("This project is using private headers and will therefore be tied to this specific Qt module build version.") message("Running this project against other versions of the Qt modules may crash at any arbitrary point.") message("This is not a bug, but a result of using Qt internals. You have been warned!") } -qtAddRpathLink($$QT $$QT_PRIVATE) -wince:static:gui { - QTLIB += qmenu_wce.res +qt_module_deps = $$CLEAN_QT $$CLEAN_QT_PRIVATE +qt_module_deps = $$resolve_depends(qt_module_deps, "QT.") + +!no_qt_rpath:!static:contains(QT_CONFIG, rpath):!contains(QT_CONFIG, static):\ + contains(qt_module_deps, core) { + relative_qt_rpath:defined(target.path, var) { + mac { + if(equals(TEMPLATE, app):app_bundle)|\ + if(equals(TEMPLATE, lib):plugin:plugin_bundle) { + ios: binpath = $$target.path/$${TARGET}.app + else: binpath = $$target.path/$${TARGET}.app/Contents/MacOS + } else: equals(TEMPLATE, lib):!plugin:lib_bundle { + binpath = $$target.path/$${TARGET}.framework/Versions/Current + } else { + binpath = $$target.path + } + QMAKE_RPATHDIR += @loader_path/$$relative_path($$[QT_INSTALL_LIBS], $$binpath) + } else { + QMAKE_LFLAGS += -Wl,-z,origin + QMAKE_RPATHDIR += $ORIGIN/$$relative_path($$[QT_INSTALL_LIBS], $$target.path) + } + } else { + QMAKE_RPATHDIR += $$[QT_INSTALL_LIBS/dev] + } } -qt_module_deps = $$QT $$QT_PRIVATE -qt_module_deps = $$replace(qt_module_deps, -private$, _private) -qt_module_deps = $$resolve_depends(qt_module_deps, "QT.") +!isEmpty(QMAKE_LFLAGS_RPATHLINK):!contains(QT_CONFIG, static) { + # -rpath-link is used by the linker to find dependencies of dynamic + # libraries which were NOT specified on the command line. + # This means that paths of direct dependencies (QT & QT_PRIVATE) + # don't need to be listed, unlike their private dependencies' paths. + privdep = $$resolve_depends(qt_module_deps, "QT.", ".depends" ".run_depends") + privdep -= $$qt_module_deps + rpaths = + for(dep, privdep): \ + rpaths += $$eval(QT.$${dep}.libs) + QMAKE_RPATHLINKDIR *= $$unique(rpaths) +} # static builds: link qml import plugins into the app. contains(qt_module_deps, qml): \ diff --git a/mkspecs/features/qt_app.prf b/mkspecs/features/qt_app.prf index 0f83fd7270..b446ed1cd1 100644 --- a/mkspecs/features/qt_app.prf +++ b/mkspecs/features/qt_app.prf @@ -30,6 +30,7 @@ host_build:force_bootstrap { } else { !build_pass:contains(QT_CONFIG, debug_and_release):contains(QT_CONFIG, build_all): CONFIG += release target.path = $$[QT_INSTALL_BINS] + CONFIG += relative_qt_rpath # Qt's tools and apps should be relocatable } INSTALLS += target diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf index 2ed43e5063..38602f642d 100644 --- a/mkspecs/features/qt_common.prf +++ b/mkspecs/features/qt_common.prf @@ -13,6 +13,8 @@ QMAKE_DIR_REPLACE_SANE += DESTDIR CONFIG -= debug_and_release_target contains(QT_CONFIG, c++11): CONFIG += c++11 strict_c++ +contains(QT_CONFIG, c++14): CONFIG += c++14 +contains(QT_CONFIG, c++1z): CONFIG += c++1z contains(TEMPLATE, .*lib) { # module and plugins !host_build:contains(QT_CONFIG, reduce_exports): CONFIG += hide_symbols @@ -46,18 +48,18 @@ warnings_are_errors:warning_clean { # If the module declares that it has does its clean-up of warnings, enable -Werror. # This setting is compiler-dependent anyway because it depends on the version of the # compiler. - clang { - # Apple clang 4.0-4.2,5.0-5.1 - # Regular clang 3.3-3.6 + clang:!ios { + # Apple clang 4.0-4.2,5.0-5.1,6.0-6.4 + # Regular clang 3.3-3.7 apple_ver = $${QT_APPLE_CLANG_MAJOR_VERSION}.$${QT_APPLE_CLANG_MINOR_VERSION} reg_ver = $${QT_CLANG_MAJOR_VERSION}.$${QT_CLANG_MINOR_VERSION} - contains(apple_ver, "4\\.[012]|5\\.[01]")|contains(reg_ver, "3\\.[3-6]") { + contains(apple_ver, "4\\.[012]|5\\.[01]|6\\.[01234]")|contains(reg_ver, "3\\.[3-7]") { QMAKE_CXXFLAGS_WARN_ON += -Werror -Wno-error=\\$${LITERAL_HASH}warnings -Wno-error=deprecated-declarations $$WERROR } } else:intel_icc:linux { - # Intel CC 13.0 - 15.0, on Linux only + # Intel CC 13.0 - 16.0, on Linux only ver = $${QT_ICC_MAJOR_VERSION}.$${QT_ICC_MINOR_VERSION} - linux:contains(ver, "(1[34]\\.|15\\.0)") { + linux:contains(ver, "(1[345]\\.|16\\.0)") { # 177: function "entity" was declared but never referenced # (too aggressive; ICC reports even for functions created due to template instantiation) # 1224: #warning directive diff --git a/mkspecs/features/qt_example_installs.prf b/mkspecs/features/qt_example_installs.prf index ff842ca754..a644904981 100644 --- a/mkspecs/features/qt_example_installs.prf +++ b/mkspecs/features/qt_example_installs.prf @@ -9,6 +9,8 @@ # We mean it. # +contains(TEMPLATE, "vc.*"): return() + defineTest(addInstallFiles) { for(sf, 2) { sf = $$relative_path($$sf, $$_PRO_FILE_PWD_) @@ -99,5 +101,7 @@ probase = $$relative_path($$_PRO_FILE_PWD_, $$dirname(_QMAKE_CONF_)/examples) SOURCES = OBJECTIVE_SOURCES = INSTALLS -= target + } else { + CONFIG += relative_qt_rpath # Examples built as part of Qt should be relocatable } } diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf index a1c499610b..6616aa4230 100644 --- a/mkspecs/features/qt_functions.prf +++ b/mkspecs/features/qt_functions.prf @@ -38,24 +38,14 @@ defineTest(qtAddLibrary) { # Reverse-engineer the module name from the library name. for(var, QT_MODULES) { isEqual(QT.$${var}.name, $$1) { - qtAddModule($$var, LIBS) + QT += $$var + export(QT) return(true) } } error("No module matching library '$$1' found.") } -# target variable, flag source variable -defineTest(qtProcessModuleFlags) { - for(flag, $$2) { - contains(flag, ^-.*): \ - $$1 -= $$replace(flag, ^-, ) - else: \ - $$1 += $$flag - } - export($$1) -} - # qt module defineTest(qtHaveModule) { !isEmpty(QT.$$replace(1, -, _).name): \ @@ -63,137 +53,6 @@ defineTest(qtHaveModule) { return(false) } -# qt module, libs variable -defineTest(qtAddModule) { - MODULE_NAME = $$eval(QT.$${1}.name) - MODULE_INCLUDES = $$eval(QT.$${1}.includes) - MODULE_LIBS = $$eval(QT.$${1}.libs) - MODULE_CONFIG = $$eval(QT.$${1}.module_config) - - contains(MODULE_CONFIG, internal_module) { - using_privates = true - export(using_privates) - } - contains(MODULE_CONFIG, ltcg): CONFIG += link_ltcg - - qtProcessModuleFlags(CONFIG, QT.$${1}.CONFIG) - qtProcessModuleFlags(DEFINES, QT.$${1}.DEFINES) - - MODULE_INCLUDES -= $$QMAKE_DEFAULT_INCDIRS - MODULE_LIBS_ADD = $$MODULE_LIBS - MODULE_LIBS_ADD -= $$QMAKE_DEFAULT_LIBDIRS - - unset(LINKAGE) - mac:contains(MODULE_CONFIG, lib_bundle) { - FRAMEWORK_INCLUDE = $${MODULE_LIBS}/$${MODULE_NAME}.framework/Headers - !qt_no_framework_direct_includes { - INCLUDEPATH *= $$FRAMEWORK_INCLUDE - } - contains(MODULE_CONFIG, internal_module): \ - INCLUDEPATH += \ - $$FRAMEWORK_INCLUDE/$$eval(QT.$${1}.VERSION) \ - $$FRAMEWORK_INCLUDE/$$eval(QT.$${1}.VERSION)/$$MODULE_NAME - QMAKE_FRAMEWORKPATH *= $${MODULE_LIBS} - export(QMAKE_FRAMEWORKPATH) - !contains(MODULE_CONFIG, no_link): \ - LINKAGE += -framework $${MODULE_NAME}$${QT_LIBINFIX} - } else { - INCLUDEPATH *= $$MODULE_INCLUDES - } - export(INCLUDEPATH) - - # Only link to this module if a libs directory is set, else this is just a module - # to give access to sources or include files, and not for linking. - !isEmpty(MODULE_LIBS):!contains(MODULE_CONFIG, no_link) { - - # Re-insert the major version in the library name (cf qt5LibraryTarget above) - # unless it's a framework build - !mac|!contains(MODULE_CONFIG, lib_bundle): \ - MODULE_NAME ~= s,^Qt,Qt$$QT_MAJOR_VERSION, - - win32 { - # Make sure the version number isn't appended again to the lib name - ver_var = QMAKE_$${upper($$MODULE_NAME$$QT_LIBINFIX)}_VERSION_OVERRIDE - dver_var = QMAKE_$${upper($$MODULE_NAME$$QT_LIBINFIX)}D_VERSION_OVERRIDE - $$ver_var = 0 - $$dver_var = 0 - export($$ver_var) - export($$dver_var) - } - - isEmpty(LINKAGE) { - !isEmpty(MODULE_LIBS_ADD): \ - LINKAGE = -L$$MODULE_LIBS_ADD - lib = $${MODULE_NAME}$${QT_LIBINFIX}$$qtPlatformTargetSuffix() - LINKAGE += -l$$lib - - contains(QT_CONFIG, rpath) { - QMAKE_RPATHDIR *= $$eval(QT.$${1}.rpath) - export(QMAKE_RPATHDIR) - } - - contains(MODULE_CONFIG, staticlib) { - PRE_TARGETDEPS *= $$MODULE_LIBS/$${QMAKE_PREFIX_STATICLIB}$${lib}.$${QMAKE_EXTENSION_STATICLIB} - export(PRE_TARGETDEPS) - } - } - - $$2 += $$LINKAGE - export($$2) - - !isEmpty(QMAKE_LSB) { - !isEmpty(MODULE_LIBS_ADD): \ - QMAKE_LFLAGS *= --lsb-libpath=$$MODULE_LIBS_ADD - QMAKE_LFLAGS *= --lsb-shared-libs=$${MODULE_NAME}$${QT_LIBINFIX} - QMAKE_LIBDIR *= /opt/lsb/lib - export(QMAKE_LFLAGS) - export(QMAKE_LIBDIR) - } - } -} - -# qt variable, libs variable -defineTest(qtAddModules) { - # qmake variables cannot contain dashes, so normalize the names first - $$1 = $$replace($$1, -private$, _private) - # Topological resolution of modules based on their QT.<module>.depends variable - $$1 = $$resolve_depends($$1, "QT.") - # Finally actually add the modules - unset(BAD_QT) - for(QTLIB, $$1) { - QTLIBNAME = $$eval(QT.$${QTLIB}.name) - isEmpty(QTLIBNAME) { - BAD_QT += $$QTLIB - next() - } - - target_qt:isEqual(TARGET, $$QTLIBNAME) { - warning("$$TARGET cannot have a $$1 of $$QTLIB") - next() - } - - qtAddModule($$QTLIB, $$2) - } - !isEmpty(BAD_QT):error("Unknown module(s) in $$1: $$replace(BAD_QT, _private$, -private)") -} - -defineTest(qtAddRpathLink) { - # -rpath-link is used by the linker to find dependencies of dynamic - # libraries which were NOT specified on the command line. - # This means that paths of direct dependencies (QT & QT_PRIVATE) - # don't need to appear here. However, their private dependencies' - # paths OTOH need to be put there. - pubqt = $$replace(1, -private$, _private) - pubdep = $$resolve_depends(pubqt, "QT.") - privdep = $$resolve_depends(pubqt, "QT.", ".depends" ".run_depends") - privdep -= $$pubdep - rpaths = - for(dep, privdep): \ - rpaths += $$eval(QT.$${dep}.libs) - QMAKE_RPATHLINKDIR *= $$unique(rpaths) - export(QMAKE_RPATHLINKDIR) -} - # variable, default, [suffix for variable for system() use], [prepare primary variable for system() use] defineTest(qtPrepareTool) { cmd = $$eval(QT_TOOL.$${2}.binary) diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf index c89b6d2793..3c0526055c 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf @@ -42,6 +42,8 @@ host_build { } } +CONFIG += relative_qt_rpath # Qt libraries should be relocatable + ucmodule = $$upper($$MODULE) isEmpty(MODULE_INCNAME): MODULE_INCNAME = $$TARGET @@ -185,6 +187,28 @@ equals(QT_ARCH, i386):contains(QT_CPU_FEATURES.$$QT_ARCH, sse2):compiler_support QMAKE_CXXFLAGS += -mfpmath=sse } +unix:!isEmpty(QMAKE_LFLAGS_VERSION_SCRIPT):!no_linker_version_script:!static { + verscript = $$OUT_PWD/$${TARGET}.version + QMAKE_LFLAGS += $${QMAKE_LFLAGS_VERSION_SCRIPT}$$verscript + + internal_module { + verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API { *; };" + } else { + current = Qt_$$QT_MAJOR_VERSION + verscript_content = "$$current { *; };" + for(i, 0..$$section(VERSION, ., 1, 1)) { + previous = $$current + current = Qt_$${QT_MAJOR_VERSION}.$$i + verscript_content += "$$current {} $$previous;" + } + } + write_file($$verscript, verscript_content)|error("Aborting.") + unset(current) + unset(previous) + unset(verscript) + unset(verscript_content) +} + android: CONFIG += qt_android_deps #install directives diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf index 1d727847e2..cc6d48ac21 100644 --- a/mkspecs/features/qt_module_pris.prf +++ b/mkspecs/features/qt_module_pris.prf @@ -49,15 +49,6 @@ MODULE_FWD_PRI = $$mod_work_pfx/qt_lib_$${MODULE_ID}.pri module_libs = "\$\$QT_MODULE_HOST_LIB_BASE" else: \ module_libs = "\$\$QT_MODULE_LIB_BASE" - unix:!static { - host_build: \ - module_rpath = $$[QT_HOST_LIBS] - else: \ - module_rpath = $$[QT_INSTALL_LIBS/dev] - module_rpath = "QT.$${MODULE_ID}.rpath = $$val_escape(module_rpath)" - } else { - module_rpath = - } !isEmpty(QT_PRIVATE): \ module_rundep = "QT.$${MODULE_ID}.run_depends = $$replace(QT_PRIVATE, -private$, _private)" else: \ @@ -115,7 +106,6 @@ MODULE_FWD_PRI = $$mod_work_pfx/qt_lib_$${MODULE_ID}.pri "" \ "QT.$${MODULE_ID}.name = $$TARGET" \ "QT.$${MODULE_ID}.libs = $$module_libs" \ - $$module_rpath \ $$module_master \ "QT.$${MODULE_ID}.includes = $$MODULE_INCLUDES" !host_build: MODULE_PRI_CONT += \ diff --git a/mkspecs/features/qt_plugin.prf b/mkspecs/features/qt_plugin.prf index 17748e518a..220f11bd75 100644 --- a/mkspecs/features/qt_plugin.prf +++ b/mkspecs/features/qt_plugin.prf @@ -30,6 +30,8 @@ tool_plugin { contains(QT_CONFIG, build_all):CONFIG += build_all } +CONFIG += relative_qt_rpath # Qt's plugins should be relocatable + CONFIG(static, static|shared)|prefix_build { isEmpty(MODULE): MODULE = $$basename(TARGET) diff --git a/mkspecs/features/winrt/default_pre.prf b/mkspecs/features/winrt/default_pre.prf new file mode 100644 index 0000000000..44e3c94b8a --- /dev/null +++ b/mkspecs/features/winrt/default_pre.prf @@ -0,0 +1,12 @@ +*msvc2015 { + # Note that the order is important, ucrt(d) has to be first + # Otherwise the linker might use malloc from a different library + # but free_dbg() from the runtime, causing assert when deleting + # items from different heaps + CONFIG(debug, debug|release): \ + QMAKE_LIBS = ucrtd.lib $$QMAKE_LIBS + else: \ + QMAKE_LIBS = ucrt.lib $$QMAKE_LIBS +} + +load(default_pre) diff --git a/mkspecs/features/winrt/package_manifest.prf b/mkspecs/features/winrt/package_manifest.prf index 7e5effa438..0f6f185170 100644 --- a/mkspecs/features/winrt/package_manifest.prf +++ b/mkspecs/features/winrt/package_manifest.prf @@ -58,9 +58,11 @@ VCLIBS = Microsoft.VCLibs.$$replace(MSVC_VER, \\., ).00 winphone: VCLIBS = $${VCLIBS}.Phone CONFIG(debug, debug|release): \ - WINRT_MANIFEST.dependencies += $${VCLIBS}.Debug + VCLIBS = $${VCLIBS}.Debug else: \ - WINRT_MANIFEST.dependencies += $$VCLIBS + VCLIBS = $${VCLIBS} + contains(MSVC_VER, "14.0"): VCLIBS = "$${VCLIBS}\" MinVersion=\"14.0.0.0\" Publisher=\"CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" + WINRT_MANIFEST.dependencies += $$VCLIBS } # Provide default values for required variables @@ -122,12 +124,11 @@ } # Dependencies are given as a string list. The CRT dependency is added automatically above. + # For MSVC2015 the dependencies are added in conjunction with TargetDeviceFamily WINRT_MANIFEST.dependencies = $$unique(WINRT_MANIFEST.dependencies) !isEmpty(WINRT_MANIFEST.dependencies) { - MANIFEST_DEPENDENCIES += "<Dependencies>" for(DEPENDENCY, WINRT_MANIFEST.dependencies): \ MANIFEST_DEPENDENCIES += " <PackageDependency Name=\"$$DEPENDENCY\" />" - MANIFEST_DEPENDENCIES += "</Dependencies>" WINRT_MANIFEST.dependencies = $$join(MANIFEST_DEPENDENCIES, $$INDENT, $$INDENT) } @@ -159,5 +160,13 @@ WINRT_MANIFEST.$${ICON_NAME} = assets/$$basename(ICON_FILE) } + !contains(TEMPLATE, "vc.*") { + winrt_manifest_install.files = $$manifest_file.output + winrt_manifest_install.path = $$target.path + winrt_assets_install.files = $$BUILD_DIR/assets/* + winrt_assets_install.path = $$target.path/assets + INSTALLS += winrt_manifest_install winrt_assets_install + } + QMAKE_SUBSTITUTES += manifest_file } diff --git a/mkspecs/features/yacc.prf b/mkspecs/features/yacc.prf index 22fe4cb0a2..e78dd8cbb3 100644 --- a/mkspecs/features/yacc.prf +++ b/mkspecs/features/yacc.prf @@ -21,11 +21,11 @@ !yacc_no_name_mangle:QMAKE_YACCDECLFLAGS += $$QMAKE_YACCFLAGS_MANGLE yacc_decl.commands = \ - -$(DEL_FILE) $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_H)} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) \ + -$(DEL_FILE) $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) \ $$QMAKE_YACC $$QMAKE_YACCDECLFLAGS ${QMAKE_FILE_IN}$$escape_expand(\\n\\t) \ - $(MOVE) $${QMAKE_YACC_HEADER} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_H)}$$escape_expand(\\n\\t) \ - $(MOVE) $${QMAKE_YACC_SOURCE} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) - yacc_decl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_H)} + $(MOVE) $${QMAKE_YACC_HEADER} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)}$$escape_expand(\\n\\t) \ + $(MOVE) $${QMAKE_YACC_SOURCE} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) + yacc_decl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} silent:yacc_decl.commands = @echo Yacc ${QMAKE_FILE_IN} && $$yacc_decl.commands QMAKE_EXTRA_COMPILERS += yacc_decl @@ -36,7 +36,7 @@ yacc_impl.input = YACCSOURCES yacc_impl.variable_out = GENERATED_SOURCES yacc_impl.commands = $$escape_expand(\\n) # We don't want any commands where, but if command is empty no rules are created - yacc_impl.depends = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_H)} # Make sure we depend on the step above - yacc_impl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_CPP)} # Faked output from this step, output really created in step above + yacc_impl.depends = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_H)} # Make sure we depend on the step above + yacc_impl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_MOD_YACC}$${first(QMAKE_EXT_CPP)} # Faked output from this step, output really created in step above QMAKE_EXTRA_COMPILERS += yacc_impl } |