summaryrefslogtreecommitdiffstats
path: root/mkspecs
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2018-04-17 19:17:25 +0200
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2018-12-07 23:48:11 +0000
commit33276e1cf14095c681ef87f1b44809b5ee1e771f (patch)
tree1d1aaf100b10b796fc3c9a6ffd5b81c628999338 /mkspecs
parentd941ebc1505cc45c7d6f8e1b2abdd2e2d9c3afae (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.prf32
-rw-r--r--mkspecs/features/qt_configure.prf62
-rw-r--r--mkspecs/features/qt_helper_lib.prf13
-rw-r--r--mkspecs/features/qt_module_pris.prf1
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) {