diff options
Diffstat (limited to 'mkspecs/features/qt_functions.prf')
-rw-r--r-- | mkspecs/features/qt_functions.prf | 234 |
1 files changed, 70 insertions, 164 deletions
diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf index 0468c51f81..f1982d6e4e 100644 --- a/mkspecs/features/qt_functions.prf +++ b/mkspecs/features/qt_functions.prf @@ -15,7 +15,7 @@ defineReplace(qtPlatformTargetSuffix) { defineReplace(qtLibraryTarget) { LIBRARY_NAME = $$1 - mac:CONFIG(shared, static|shared):contains(QT_CONFIG, qt_framework) { + CONFIG(shared, static|shared):contains(QT_CONFIG, qt_framework) { QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME export(QMAKE_FRAMEWORK_BUNDLE_NAME) } @@ -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) @@ -211,6 +70,7 @@ defineTest(qtPrepareTool) { } } QT_TOOL_ENV += $$eval(QT_TOOL.$${2}.envvars) + QT_TOOL_NAME = $$2 !isEmpty(3)|!isEmpty(4) { $$1$$3 = for (arg, cmd): \ @@ -231,29 +91,73 @@ defineTest(qtAddToolEnv) { ds = $$QMAKE_DIR_SEP else: \ ds = $$DIR_SEPARATOR + batch_sets = for(env, 2) { value = $$eval($${env}.value) !isEmpty(value) { name = $$eval($${env}.name) + config = $$eval($${env}.CONFIG) equals(ds, /) { - contains($${env}.CONFIG, prepend): infix = \${$$name:+:\$$$name} + contains(config, prepend): infix = \${$$name:+:\$$$name} + else: contains(config, always_prepend): infix = :\$$$name else: infix = - val = "$$name=$$shell_quote($$join(value, :))$$infix" + # Under msys, this path is taken only in the non-system() + # case, so using shell_quote() always works. + batch_sets += \ + "$$name=$$shell_quote($$join(value, :))$$infix" \ + "export $$name" } else { - # Escape closing parens when expanding the variable, otherwise cmd confuses itself. - contains($${env}.CONFIG, prepend): infix = ;%$$name:)=^)% - else: infix = + value ~= s,\\^,^^^^,g + value ~= s,!,^^!,g value ~= s,\\),^),g - val = "(set $$name=$$join(value, ;)$$infix) &" - } - isEmpty(3): !contains(TEMPLATE, vc.*) { - contains(MAKEFILE_GENERATOR, MS.*): val ~= s,%,%%,g - val ~= s,\\\$,\$\$,g + contains(config, prepend) { + batch_sets += \ + "if defined $$name (" \ + " set $$name=$$join(value, ;);!$$name!" \ + ") else (" \ + " set $$name=$$join(value, ;)" \ + ")" + } else: contains(config, always_prepend) { + batch_sets += "(set $$name=$$join(value, ;);!$$name!)" + } else { + batch_sets += "(set $$name=$$join(value, ;))" + } } - $$1 = "$$val $$eval($$1)" } } + !isEmpty(batch_sets) { + batch_name = wrapper + !isEmpty(QT_TOOL_NAME): batch_name = $${QT_TOOL_NAME}_wrapper + cmd = $$eval($$1) + !isEmpty(cmd): cmd = "$$cmd " + equals(ds, /) { + batch_name = $${batch_name}.sh + batch_cont = \ + "$$LITERAL_HASH!/bin/sh" \ + $$batch_sets \ + "exec $$cmd\"$@\"" + # It would be nicer to use the '.' command (without 'exec' above), + # but that doesn't set the positional arguments under (d)ash. + $$1 = + } else { + batch_name = $${batch_name}.bat + batch_cont = \ + "@echo off" \ + "SetLocal EnableDelayedExpansion" \ + $$batch_sets \ + "$$cmd%*" \ + "EndLocal" + $$1 = call + } + !build_pass:!write_file($$OUT_PWD/$$batch_name, batch_cont, exe): error("Aborting.") + isEmpty(3): \ + $$1 += $$shell_quote($$shell_path($$OUT_PWD/$$batch_name)) + else: \ + $$1 += $$system_quote($$system_path($$OUT_PWD/$$batch_name)) + QMAKE_DISTCLEAN += $$OUT_PWD/$$batch_name + } export($$1) + export(QMAKE_DISTCLEAN) } # target variable, dependency var name, [non-empty: prepare for system(), not make] @@ -261,15 +165,9 @@ defineTest(qtAddTargetEnv) { deps = $$replace($$2, -private$, _private) deps = $$resolve_depends(deps, "QT.", ".depends" ".run_depends") !isEmpty(deps) { - ptypes = - for(dep, deps) { - isEmpty(3): \ - deppath += $$shell_path($$eval(QT.$${dep}.libs)) - else: \ - deppath += $$system_path($$eval(QT.$${dep}.libs)) - ptypes += $$eval(QT.$${dep}.plugin_types) - } + deppath.CONFIG = prepend equals(QMAKE_HOST.os, Windows) { + deppath.CONFIG = always_prepend deppath.name = PATH } else:contains(QMAKE_HOST.os, Linux|FreeBSD|OpenBSD|NetBSD|DragonFly|SunOS|HP-UX|QNX|GNU) { deppath.name = LD_LIBRARY_PATH @@ -285,8 +183,15 @@ defineTest(qtAddTargetEnv) { } else { error("Operating system not supported.") } + ptypes = + for(dep, deps) { + isEmpty(3): \ + deppath += $$shell_path($$eval(QT.$${dep}.libs)) + else: \ + deppath += $$system_path($$eval(QT.$${dep}.libs)) + ptypes += $$eval(QT.$${dep}.plugin_types) + } deppath.value = $$unique(deppath) - deppath.CONFIG = prepend pluginpath.value = ppaths = $$[QT_INSTALL_PLUGINS/get] @@ -301,6 +206,7 @@ defineTest(qtAddTargetEnv) { pluginpath.value += $$system_path($$qplug) } pluginpath.name = QT_PLUGIN_PATH + pluginpath.CONFIG = prepend QT_TOOL_ENV += deppath pluginpath } |