diff options
author | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2018-04-17 19:17:25 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2018-12-07 23:48:11 +0000 |
commit | 33276e1cf14095c681ef87f1b44809b5ee1e771f (patch) | |
tree | 1d1aaf100b10b796fc3c9a6ffd5b81c628999338 /mkspecs | |
parent | d941ebc1505cc45c7d6f8e1b2abdd2e2d9c3afae (diff) |
add support for transitive deps to QMAKE_USE
we already knew the dependencies (as they are declared in the json
files), but failed to export them in any way, which made linking against
statically built external deps which have deps in turn fail (unless the
project happened to pull in the dep anyway, as is the case with qtcore +
zlib).
the previous assumption was that the USE-able library objects would be
self-contained, but that is conceptually unclean. instead, properly
export the raw dependencies and resolve them only in qmake_use.prf.
note that pkg-config produces self-contained output, so we need to
actively subtract the dependencies we know.
Change-Id: I4b41a7efc05bbd309a6d66275d7557a80efd5af4
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Diffstat (limited to 'mkspecs')
-rw-r--r-- | mkspecs/features/qmake_use.prf | 32 | ||||
-rw-r--r-- | mkspecs/features/qt_configure.prf | 62 | ||||
-rw-r--r-- | mkspecs/features/qt_helper_lib.prf | 13 | ||||
-rw-r--r-- | mkspecs/features/qt_module_pris.prf | 1 |
4 files changed, 90 insertions, 18 deletions
diff --git a/mkspecs/features/qmake_use.prf b/mkspecs/features/qmake_use.prf index dba45de92a..8159e471a2 100644 --- a/mkspecs/features/qmake_use.prf +++ b/mkspecs/features/qmake_use.prf @@ -1,23 +1,31 @@ suffix = for(ever) { - QMAKE_USE$${suffix} = $$unique(QMAKE_USE$${suffix}) + CC_USES = + LD_USES = for (use, QMAKE_USE$${suffix}) { use = $$split(use, /) name = $$take_first(use) nu = $$upper($$name) + !contains(use, linkonly): CC_USES += $$nu + !contains(use, nolink): LD_USES += $$nu + } + CC_USES = $$resolve_depends(CC_USES, QMAKE_DEPENDS_, _CC) + for (nu, CC_USES) { + !defined(QMAKE_LIBS_$$nu, var): \ + error("Library '$$lower($$nu)' is not defined.") + + DEFINES += $$eval(QMAKE_DEFINES_$${nu}) + INCLUDEPATH += $$eval(QMAKE_INCDIR_$${nu}) + } + LD_USES = $$resolve_depends(LD_USES, QMAKE_DEPENDS_, _LD) + for (nu, LD_USES) { !defined(QMAKE_LIBS_$$nu, var): \ - error("Library '$$name' is not defined.") + error("Library '$$lower($$nu)' is not defined.") - !contains(use, nolink) { - debug: \ - LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_DEBUG) $$eval(QMAKE_LIBS_$$nu) - else: \ - LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_RELEASE) $$eval(QMAKE_LIBS_$$nu) - } - !contains(use, linkonly) { - DEFINES += $$eval(QMAKE_DEFINES_$${nu}) - INCLUDEPATH += $$eval(QMAKE_INCDIR_$${nu}) - } + debug: \ + LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_DEBUG) $$eval(QMAKE_LIBS_$$nu) + else: \ + LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_RELEASE) $$eval(QMAKE_LIBS_$$nu) } !isEmpty(suffix): break() suffix = "_PRIVATE" diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index d75365cd0a..d8f5af5404 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -743,6 +743,21 @@ defineTest(qtConfLibrary_pkgConfig) { !qtConfResolvePathIncs($${1}.includedir, $$includes): \ return(false) $${1}.defines = $$defines + + # now remove the content of the transitive deps we know about. + largs = $$qtConfAllLibraryArgs($$eval($${2}.dependencies)) + for (la, largs): \ + eval("$$la") + USES = $$eval($$list($$upper($$QMAKE_USE))) + # _CC == _LD for configure's library sources, so pick first arbitrarily. + DEPS = $$resolve_depends(USES, QMAKE_DEPENDS_, _CC) + for (DEP, DEPS) { + $${1}.libs -= $$eval(QMAKE_LIBS_$${DEP}) + $${1}.includedir -= $$eval(QMAKE_INCDIR_$${DEP}) + $${1}.defines -= $$eval(QMAKE_DEFINES_$${DEP}) + } + export($${1}.libs) + export($${1}.includedir) export($${1}.defines) return(true) @@ -776,20 +791,36 @@ defineReplace(qtConfLibraryArgs) { defines = $$eval($${1}.defines) !isEmpty(defines): \ qmake_args += "QMAKE_DEFINES_$${NAME} = $$val_escape(defines)" + depends = $$eval($${2}.dependencies) + !isEmpty(depends) { + dep_uses = + for (use, depends): \ + dep_uses += $$section(use, :, 1, 1) + qmake_args += \ + "QMAKE_DEPENDS_$${NAME}_CC = $$upper($$dep_uses)" \ + "QMAKE_DEPENDS_$${NAME}_LD = $$upper($$dep_uses)" + } return($$qmake_args) } defineReplace(qtConfAllLibraryArgs) { isEmpty(1): return() dep_uses = + for (use, 1): \ + dep_uses += $$section(use, :, 1, 1) dep_args = - for (use, 1) { + seen = + for(ever) { + isEmpty(1): break() + use = $$take_last(1) + contains(seen, $$use): next() + seen += $$use use_cfg = $$section(use, :, 0, 0) - use_lib = $$section(use, :, 1, 1) - dep_uses += $$use_lib !isEmpty(use_cfg) { + use_lib = $$section(use, :, 1, 1) lpfx = $${use_cfg}.libraries.$$use_lib - dep_args += $$qtConfLibraryArgs($${lpfx}.sources.$$eval($${lpfx}.source)) + dep_args += $$qtConfLibraryArgs($${lpfx}.sources.$$eval($${lpfx}.source), $$lpfx) + 1 += $$eval($${lpfx}.dependencies) } } return("QMAKE_USE += $$dep_uses" $$dep_args) @@ -818,6 +849,24 @@ defineTest(qtConfExportLibrary) { !isEmpty(defines): qtConfOutputVar(assign, $$output, QMAKE_DEFINES_$$NAME, $$defines) includes = $$eval($${spfx}.includedir) !isEmpty(includes): qtConfOutputVar(assign, $$output, QMAKE_INCDIR_$$NAME, $$includes) + uses = $$eval($${lpfx}.dependencies) + !isEmpty(uses) { + # FIXME: ideally, we would export transitive deps only for static + # libs, to not extend the link interface unduly. however, the system + # does currently not differentiate between public and private deps. + depends = + for (use, uses) { + use_cfg = $$section(use, :, 0, 0) + use_lib = $$section(use, :, 1, 1) + !isEmpty(use_cfg): \ + depends += $$upper($$eval($${use_cfg}.libraries.$${use_lib}.export)) + else: \ + depends += $$upper($$use_lib) + } + # we use suffixes instead of infixes, because $$resolve_depends() demands it. + qtConfOutputVar(assign, $$output, QMAKE_DEPENDS_$${NAME}_CC, $$depends) + qtConfOutputVar(assign, $$output, QMAKE_DEPENDS_$${NAME}_LD, $$depends) + } !isEmpty($${currentConfig}.module): \ qtConfExtendVar($$output, "QT.$${currentModule}_private.libraries", $$name) } @@ -843,7 +892,8 @@ defineTest(qtConfHandleLibrary) { export($${lpfx}.result) return() } - resolved_uses = $$eval($${lpfx}.resolved_uses) + $${lpfx}.dependencies = $$eval($${lpfx}.resolved_uses) + export($${lpfx}.dependencies) qtConfLoadResult($${lpfx}, $$1, "library") { $$eval($${lpfx}.result): \ @@ -881,7 +931,7 @@ defineTest(qtConfHandleLibrary) { # if the library defines a test, use it to verify the source. !isEmpty($${lpfx}.test)|!isEmpty($${lpfx}.test._KEYS_) { - $${lpfx}.resolved_uses = $$currentConfig:$$1 $$resolved_uses + $${lpfx}.resolved_uses = $$currentConfig:$$1 $${lpfx}.host = $$eval($${spfx}.host) !qtConfTest_compile($$lpfx) { qtLog(" => source failed verification.") diff --git a/mkspecs/features/qt_helper_lib.prf b/mkspecs/features/qt_helper_lib.prf index 1a8446acb4..05d3b941bd 100644 --- a/mkspecs/features/qt_helper_lib.prf +++ b/mkspecs/features/qt_helper_lib.prf @@ -41,7 +41,20 @@ THE_TARGET = $$qt5LibraryTarget($$TARGET) prefix = $$QMAKE_PREFIX_SHLIB suffix = $$QMAKE_EXTENSION_SHLIB } + CC_USES = + LD_USES = + for (use, QMAKE_USE) { + use = $$split(use, /) + name = $$take_first(use) + nu = $$upper($$name) + !contains(use, linkonly): CC_USES += $$nu + !contains(use, nolink): LD_USES += $$nu + } + CC_USES = $$unique(CC_USES) + LD_USES = $$unique(LD_USES) MODULE_PRI_CONT = \ + "QMAKE_DEPENDS_$${ucmodule}_CC =$$join(CC_USES, " ", " ")" \ + "QMAKE_DEPENDS_$${ucmodule}_LD =$$join(LD_USES, " ", " ")" \ "QMAKE_INCDIR_$${ucmodule} = $$val_escape(MODULE_INCLUDEPATH)" \ "QMAKE_DEFINES_$${ucmodule} = $$val_escape(MODULE_DEFINES)" debug_and_release { diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf index 163f52f23f..e0556ce960 100644 --- a/mkspecs/features/qt_module_pris.prf +++ b/mkspecs/features/qt_module_pris.prf @@ -56,6 +56,7 @@ defineReplace(qtExportLibsForModule) { for (lib, QT.$${1}.libraries) { NAME = $$upper($$lib) vars = \ + QMAKE_DEPENDS_$${NAME}_CC QMAKE_DEPENDS_$${NAME}_LD \ QMAKE_LIBS_$$NAME QMAKE_LIBS_$${NAME}_DEBUG QMAKE_LIBS_$${NAME}_RELEASE \ QMAKE_DEFINES_$$NAME QMAKE_INCDIR_$$NAME for (var, vars) { |