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>
This commit is contained in:
Oswald Buddenhagen 2018-04-17 19:17:25 +02:00
parent d941ebc150
commit 33276e1cf1
4 changed files with 90 additions and 18 deletions

View File

@ -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 '$$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})
}
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 '$$lower($$nu)' is not defined.")
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"

View File

@ -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.")

View File

@ -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 {

View File

@ -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) {