Skip to content

Commit

Permalink
configure: enable sharing of inlined source code between tests
Browse files Browse the repository at this point in the history
this is implemented by means of (multiple) inheritance, which applies
specifically only to the inlined source and header list, but not to
library sources or dependencies.

Change-Id: I8f1d5b34d1d2d12e39225dc50357ad6ec648c6b6
Reviewed-by: Joerg Bornemann <[email protected]>
  • Loading branch information
ossilator committed Dec 19, 2018
1 parent a820769 commit 6b39d51
Showing 1 changed file with 41 additions and 18 deletions.
59 changes: 41 additions & 18 deletions mkspecs/features/qt_configure.prf
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,16 @@ defineTest(qtConfResolvePathLibs) {
return($$ret)
}

defineReplace(qtConfGetTestSourceList) {
result =
!isEmpty($${1}.test.inherit) {
base = $$section(1, ., 0, -2)
for (i, $${1}.test.inherit): \
result += $$qtConfGetTestSourceList($${base}.$$i)
}
return($$result $$1)
}

defineReplace(qtConfGetTestIncludes) {
defined($${1}._KEYS_, var) {
1st = $$first($${1}._KEYS_)
Expand Down Expand Up @@ -637,7 +647,10 @@ defineTest(qtConfResolvePathIncs) {
# thus make the code below work.
return($$ret)
}
hdrs = $$qtConfGetTestIncludes($${3}.headers)
tests = $$qtConfGetTestSourceList($$3)
hdrs =
for (test, tests): \
hdrs += $$qtConfGetTestIncludes($${test}.headers)
for (hdr, hdrs) {
h = $$qtConfFindInPathList($$hdr, $$2 $$EXTRA_INCLUDEPATH $$QMAKE_DEFAULT_INCDIRS)
isEmpty(h) {
Expand Down Expand Up @@ -1109,10 +1122,14 @@ defineTest(qtConfTestPrepare_compile) {
}

defineTest(qtConfPrepareCompileTestSource) {
test_dir = $$3
test_dir = $$2

test_lang = $$eval($${1}.lang)
isEmpty(test_lang): test_lang = "c++"
tests = $$qtConfGetTestSourceList($$1)

test_lang = "c++"
for (test, tests): \
test_lang += $$eval($${test}.test.lang)
test_lang = $$last(test_lang) # Last non-empty, that is.

equals(test_lang, "c++"): suffix = "cpp"
else: equals(test_lang, "c"): suffix = "c"
Expand All @@ -1123,25 +1140,30 @@ defineTest(qtConfPrepareCompileTestSource) {
# Create source code
contents = "/* Generated by configure */"
# Custom code before includes
for (ent, $$qtConfScalarOrList($${1}.head)): \
contents += $$ent
for (test, tests): \
for (ent, $$qtConfScalarOrList($${test}.test.head)): \
contents += $$ent
# Includes
hdrs = $$qtConfGetTestIncludes($${1}.include)
isEmpty(hdrs): \
hdrs = $$qtConfGetTestIncludes($$2)
for (ent, hdrs): \
contents += "$${LITERAL_HASH}include <$$ent>"
for (test, tests) {
hdrs = $$qtConfGetTestIncludes($${test}.test.include)
isEmpty(hdrs): \
hdrs = $$qtConfGetTestIncludes($${test}.headers)
for (ent, hdrs): \
contents += "$${LITERAL_HASH}include <$$ent>"
}
# Custom code after includes
for (ent, $$qtConfScalarOrList($${1}.tail)): \
contents += $$ent
for (test, tests): \
for (ent, $$qtConfScalarOrList($${test}.test.tail)): \
contents += $$ent
# And finally the custom code inside main()
contents += \
"int main(int argc, char **argv)" \
"{" \
" (void)argc; (void)argv;" \
" /* BEGIN TEST: */"
for (ent, $$qtConfScalarOrList($${1}.main)): \
contents += " $$ent"
for (test, tests): \
for (ent, $$qtConfScalarOrList($${test}.test.main)): \
contents += " $$ent"
contents += \
" /* END TEST */" \
" return 0;" \
Expand All @@ -1151,8 +1173,9 @@ defineTest(qtConfPrepareCompileTestSource) {
# Create stub .pro file
contents = "SOURCES = main.$$suffix"
# Custom project code
for (ent, $$qtConfScalarOrList($${1}.qmake)): \
contents += $$ent
for (test, tests): \
for (ent, $$qtConfScalarOrList($${test}.test.qmake)): \
contents += $$ent
write_file($$test_dir/$$basename(test_dir).pro, contents)|error()
}

Expand All @@ -1165,7 +1188,7 @@ defineTest(qtConfTest_compile) {
isEmpty(test) {
test_dir = $$test_base_out_dir/$$section(1, ".", -1)
test_out_dir = $$test_dir
qtConfPrepareCompileTestSource($${1}.test, $${1}.headers, $$test_dir)
qtConfPrepareCompileTestSource($$1, $$test_dir)
} else {
test_dir = $$QMAKE_CONFIG_TESTS_DIR/$$test
test_out_dir = $$test_base_out_dir/$$test
Expand Down

0 comments on commit 6b39d51

Please sign in to comment.