summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/qt_configure.prf
diff options
context:
space:
mode:
Diffstat (limited to 'mkspecs/features/qt_configure.prf')
-rw-r--r--mkspecs/features/qt_configure.prf167
1 files changed, 101 insertions, 66 deletions
diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf
index 4039bba431..81b820978a 100644
--- a/mkspecs/features/qt_configure.prf
+++ b/mkspecs/features/qt_configure.prf
@@ -495,6 +495,15 @@ defineTest(qtConfLibrary_inline) {
!defined($${1}.libs, var):isEmpty($${1}.builds._KEYS_): \
error("'inline' source in library '$$lib' specifies neither 'libs' nor 'builds'.")
+ # library lists are specified as strings in the json sources for
+ # readability, but it's a pain to work with that, so expand it now.
+ eval($${1}.libs = $$eval($${1}.libs))
+ export($${1}.libs)
+ for (b, $${1}.builds._KEYS_) {
+ eval($${1}.builds.$${b} = $$eval($${1}.builds.$${b}))
+ export($${1}.builds.$${b})
+ }
+
# if multiple libraries provide the same export, it makes sense
# to make them recognize the same input variables.
input = $$eval($${2}.alias)
@@ -507,7 +516,7 @@ defineTest(qtConfLibrary_inline) {
iv = $${input}.libs.$${b}
vars += $$eval(config.commandline.rev_assignments.$${iv})
defined(config.input.$${iv}, var) {
- $${1}.builds.$${b} = $$eval(config.input.$${iv})
+ eval($${1}.builds.$${b} = $$eval(config.input.$${iv}))
export($${1}.builds.$${b})
$${1}.builds._KEYS_ *= $${b}
any = true
@@ -528,28 +537,28 @@ defineTest(qtConfLibrary_inline) {
# direct libs. overwrites inline libs.
defined(config.input.$${input}.libs, var) {
- $${1}.libs = $$eval(config.input.$${input}.libs)
+ eval($${1}.libs = $$eval(config.input.$${input}.libs))
export($${1}.libs)
}
# prefix. prepends to (possibly overwritten) inline libs.
- prefix = $$val_escape(config.input.$${input}.prefix)
+ prefix = $$eval(config.input.$${input}.prefix)
!isEmpty(prefix) {
$${1}.includedir = $$prefix/include
export($${1}.includedir)
- $${1}.libs = "-L$$prefix/lib $$eval($${1}.libs)"
+ $${1}.libs = -L$$prefix/lib $$eval($${1}.libs)
export($${1}.libs)
}
- incdir = $$val_escape(config.input.$${input}.incdir)
+ incdir = $$eval(config.input.$${input}.incdir)
!isEmpty(incdir) {
$${1}.includedir = $$incdir
export($${1}.includedir)
}
- libdir = $$val_escape(config.input.$${input}.libdir)
+ libdir = $$eval(config.input.$${input}.libdir)
!isEmpty(libdir) {
- $${1}.libs = "-L$$libdir $$eval($${1}.libs)"
+ $${1}.libs = -L$$libdir $$eval($${1}.libs)
export($${1}.libs)
}
@@ -563,13 +572,12 @@ defineTest(qtConfLibrary_makeSpec) {
isEmpty(spec): \
error("makeSpec source in library '$$eval($${1}.library)' does not specify 'spec'.")
- $${1}.includedir = "$$val_escape(QMAKE_INCDIR_$$spec)"
+ $${1}.includedir = $$eval(QMAKE_INCDIR_$$spec)
export($${1}.includedir)
- libs =
+ $${1}.libs =
for (l, QMAKE_LIBDIR_$$spec): \
- libs += -L$$l
- libs += $$eval(QMAKE_LIBS_$$spec)
- $${1}.libs = "$$val_escape(libs)"
+ $${1}.libs += -L$$l
+ $${1}.libs += $$eval(QMAKE_LIBS_$$spec)
export($${1}.libs)
# the library definition is always in scope, so no point in exporting it.
@@ -596,13 +604,39 @@ defineTest(qtConfLibrary_pkgConfig) {
qtRunLoggedCommand("$$pkg_config --modversion $$args", version)|return(false)
qtRunLoggedCommand("$$pkg_config --libs-only-L $$args", libpaths)|return(false)
qtRunLoggedCommand("$$pkg_config --libs-only-l $$args", libs)|return(false)
- qtRunLoggedCommand("$$pkg_config --cflags $$args", $${1}.cflags)|return(false)
version ~= s/[^0-9.].*$//
$${1}.version = $$first(version)
export($${1}.version)
- libpaths += $$libs
- $${1}.libs = "$$libpaths"
+ eval($${1}.libs = $$libpaths $$libs)
export($${1}.libs)
+
+ qtRunLoggedCommand("$$pkg_config --cflags $$args", $${1}.cflags)|return(false)
+ # Split CFLAGS into stuff that goes into DEFINES, INCLUDEPATH, and other stuff.
+ # The compound variable is still set in case something wants to use it outside
+ # regular library exports.
+ defines =
+ includes =
+ ignored =
+ eval(cflags = $$eval($${1}.cflags))
+ for (i, cflags) {
+ contains(i, "-I.*") {
+ i ~= s/^-I//
+ includes += $$i
+ } else: contains(i, "-D.*") {
+ i ~= s/^-D//
+ defines += $$i
+ } else {
+ # Sometimes, pkg-config files include other flags
+ # we really don't need and shouldn't add.
+ ignored += $$i
+ }
+ }
+ !isEmpty(ignored): \
+ qtLog("Note: Dropped compiler flags '$$ignored'.")
+ $${1}.defines = $$defines
+ export($${1}.defines)
+ $${1}.includedir = $$includes
+ export($${1}.includedir)
return(true)
}
@@ -624,21 +658,35 @@ defineTest(qtConfTest_getPkgConfigVariable) {
}
defineReplace(qtConfLibraryArgs) {
- qmake_args =
- libs = $$eval($${1}.libs)
- !isEmpty(libs): \
- qmake_args += $$system_quote(LIBS += $$libs)
+ NAME = $$upper($$eval($${1}.library))
+ qmake_args = "QMAKE_LIBS_$${NAME} = $$val_escape($${1}.libs)"
for (b, $${1}.builds._KEYS_): \
- qmake_args += $$system_quote(LIBS_$$upper($$b) += $$eval($${1}.builds.$${b}))
+ qmake_args += "QMAKE_LIBS_$${NAME}_$$upper($$b) = $$val_escape($${1}.builds.$${b})"
includedir = $$eval($${1}.includedir)
!isEmpty(includedir): \
- qmake_args += $$system_quote(INCLUDEPATH *= $$includedir)
- cflags = $$eval($${1}.cflags)
- !isEmpty(cflags): \
- qmake_args += $$system_quote(QMAKE_CFLAGS += $$cflags) $$system_quote(QMAKE_CXXFLAGS += $$cflags)
+ qmake_args += "QMAKE_INCDIR_$${NAME} = $$val_escape(includedir)"
+ defines = $$eval($${1}.defines)
+ !isEmpty(defines): \
+ qmake_args += "QMAKE_DEFINES_$${NAME} = $$val_escape(defines)"
return($$qmake_args)
}
+defineReplace(qtConfAllLibraryArgs) {
+ isEmpty(1): return()
+ dep_uses =
+ dep_args =
+ for (use, 1) {
+ use_cfg = $$section(use, :, 0, 0)
+ use_lib = $$section(use, :, 1, 1)
+ dep_uses += $$use_lib
+ !isEmpty(use_cfg) {
+ lpfx = $${use_cfg}.libraries.$$use_lib
+ dep_args += $$qtConfLibraryArgs($${lpfx}.sources.$$eval($${lpfx}.source))
+ }
+ }
+ return("QMAKE_USE += $$dep_uses" $$dep_args)
+}
+
defineTest(qtConfExportLibrary) {
lpfx = $${currentConfig}.libraries.$$1
alias = $$eval($${lpfx}.alias)
@@ -650,38 +698,17 @@ defineTest(qtConfExportLibrary) {
!$$qtConfEvaluate($$eval($${spfx}.export)): return()
output = privatePro
-
- eval(libs = $$eval($${spfx}.libs))
- eval(cflags = $$eval($${spfx}.cflags))
- eval(includes = $$eval($${spfx}.includedir))
-
- # Split $$cflags into stuff that goes into DEFINES, INCLUDEPATH, and other stuff.
- defines =
- ignored =
- for (i, cflags) {
- contains(i, "-I.*") {
- i ~= s/^-I//
- includes += $$i
- } else: contains(i, "-D.*") {
- i ~= s/^-D//
- defines += $$i
- } else {
- # Sometimes, pkg-config files or *-config scripts include other flags
- # we really don't need and shouldn't add (pg_config is really bad).
- ignored += $$i
- }
- }
- !isEmpty(ignored): \
- qtConfAddNote("Dropped compiler flags '$$ignored' when detecting library '$$name'.")
-
NAME = $$upper($$name)
# LIBS is emitted even if empty, as this allows the library to be "seen".
+ libs = $$eval($${spfx}.libs)
qtConfOutputVar(assign, $$output, QMAKE_LIBS_$$NAME, $$libs)
for (b, $${spfx}.builds._KEYS_) {
- eval(blibs = $$eval($${spfx}.builds.$${b}))
+ blibs = $$eval($${spfx}.builds.$${b})
qtConfOutputVar(assign, $$output, QMAKE_LIBS_$${NAME}_$$upper($$b), $$blibs)
}
+ defines = $$eval($${spfx}.defines)
!isEmpty(defines): qtConfOutputVar(assign, $$output, QMAKE_DEFINES_$$NAME, $$defines)
+ includes = $$eval($${spfx}.includedir)
!isEmpty(includes): qtConfOutputVar(assign, $$output, QMAKE_INCDIR_$$NAME, $$includes)
!isEmpty($${currentConfig}.module): \
qtConfExtendVar($$output, "QT.$${currentModule}_private.libraries", $$name)
@@ -708,7 +735,7 @@ defineTest(qtConfHandleLibrary) {
export($${lpfx}.result)
return()
}
- use_args = $$eval($${lpfx}.literal_args)
+ resolved_uses = $$eval($${lpfx}.resolved_uses)
qtConfLoadResult($${lpfx}, $$1, "library") {
$$eval($${lpfx}.result): \
@@ -741,9 +768,12 @@ defineTest(qtConfHandleLibrary) {
next()
}
+ $${lpfx}.source = $$s
+ export($${lpfx}.source)
+
# if the library defines a test, use it to verify the source.
!isEmpty($${lpfx}.test)|!isEmpty($${lpfx}.test._KEYS_) {
- $${lpfx}.literal_args = $$qtConfLibraryArgs($$spfx) $$use_args
+ $${lpfx}.resolved_uses = $$currentConfig:$$1 $$resolved_uses
$${lpfx}.host = $$eval($${spfx}.host)
!qtConfTest_compile($$lpfx) {
qtLog(" => source failed verification.")
@@ -759,9 +789,6 @@ defineTest(qtConfHandleLibrary) {
for (b, $${spfx}.builds._KEYS_): \
$${lpfx}.cache += sources.$${s}.builds.$${b}
- $${lpfx}.source = $$s
- export($${lpfx}.source)
-
# immediately output the library as well.
qtConfExportLibrary($$1)
@@ -855,21 +882,30 @@ defineTest(qtConfTestPrepare_compile) {
!defined(QMAKE_LIBS_$$nu, var): \
error("Test $$1 tries to use undeclared library '$$u'")
# using an external library by exported name.
- $${1}.literal_args += $$system_quote(QMAKE_USE += $$u)
+ $${1}.resolved_uses += :$$u
} else {
lpfx = $${libConfig}.libraries.$${u}
- isEmpty($${lpfx}.source): \
+ !equals($${lpfx}.result, true): \
return(false)
- $${1}.literal_args += $$qtConfLibraryArgs($${lpfx}.sources.$$eval($${lpfx}.source))
+ $${1}.resolved_uses += $$libConfig:$$u
}
}
- export($${1}.literal_args)
+ export($${1}.resolved_uses)
return(true)
}
defineTest(qtConfPrepareCompileTestSource) {
test_dir = $$2
+ test_lang = $$eval($${1}.lang)
+ isEmpty(test_lang): test_lang = "c++"
+
+ equals(test_lang, "c++"): suffix = "cpp"
+ else: equals(test_lang, "c"): suffix = "c"
+ else: equals(test_lang, "objc"): suffix = "m"
+ else: equals(test_lang, "objc++"): suffix = "mm"
+ else: error("Unknown language '$$test_lang' in compile test $$1")
+
# Create source code
contents = "/* Generated by configure */"
# Custom code before includes
@@ -893,10 +929,10 @@ defineTest(qtConfPrepareCompileTestSource) {
" /* END TEST */" \
" return 0;" \
"}"
- write_file($$test_dir/main.cpp, contents)|error()
+ write_file($$test_dir/main.$$suffix, contents)|error()
# Create stub .pro file
- contents = "SOURCES = main.cpp"
+ contents = "SOURCES = main.$$suffix"
# Custom project code
for (ent, $$qtConfScalarOrList($${1}.qmake)): \
contents += $$ent
@@ -983,8 +1019,12 @@ defineTest(qtConfTest_compile) {
cont = "CONFIG += QTDIR_build"
write_file($$test_base_out_dir/.qmake.cache, cont)|error()
+ $${1}.literal_args += $$qtConfAllLibraryArgs($$eval($${1}.resolved_uses))
+
# add possible command line args
- qmake_args += $$qtConfPrepareArgs($$eval($${1}.args)) $$eval($${1}.literal_args)
+ qmake_args += \
+ $$qtConfPrepareArgs($$eval($${1}.args)) \
+ $$qtSystemQuote($$eval($${1}.literal_args))
qtRunLoggedCommand("$$test_cmd_base $$qmake_args $$system_quote($$test_dir)") {
qtRunLoggedCommand("$$test_cmd_base $$QMAKE_MAKE"): \
@@ -994,11 +1034,6 @@ defineTest(qtConfTest_compile) {
return(false)
}
-defineTest(qtConfTest_verifySpec) {
- qtConfTest_compile($$1): return(true)
- qtConfFatalError("Cannot compile a minimal program. The toolchain or QMakeSpec is broken.", log)
-}
-
defineTest(qtConfTest_files) {
for(i, $${1}.files._KEYS_) {
f = $$eval($${1}.files.$${i})