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:
parent
d941ebc150
commit
33276e1cf1
@ -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"
|
||||
|
@ -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.")
|
||||
|
@ -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 {
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user