qt5base-lts/mkspecs/features/testcase.prf
Oswald Buddenhagen 282f15feaa rewrite qtAddToolEnv()
the primary purpose is making env var prepend mode work for unset
variables on windows. this is achieved by using a conditional and delayed
variable expansion. however, the latter is disabled by default and can
be locally enabled only in batch files. therefore, write wrapper scripts
and substitute them for the actual commands. we do this also on unix,
both for consistency and simply because the commands look much less
confusing.

this change is slightly backwards-incompatible, as invoking
qtAddToolEnv() multiple times on the same command will now make a total
mess. also, invoking it on a command that contains 'make' macro
expansions isn't a good idea, so testcase.prf needed an adjustment. the
function is an undocumented internal, so Nobody Should Care (TM).

this also reverts 80ebedecf9, as it's obsolete now.

Change-Id: I8394b77868b495abcf27b688996ca74c40b80994
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
2016-01-08 09:36:13 +00:00

206 lines
6.8 KiB
Plaintext

have_target {
# qt_build_config.prf disables execptions for all Qt modules which don't
# explicitly turn it on again, while the qmake default is to build with
# exceptions. As we want tests to be built like 3rd party applications,
# qt_build_config tells us to re-enable exceptions here.
testcase_exceptions: CONFIG += exceptions
check.files =
check.path = .
# Add environment for non-installed builds. Do this first, so the
# 'make' variable expansions don't end up in a batch file/script.
QT_TOOL_NAME = target
qtAddTargetEnv(check.commands, QT)
# If the test ends up in a different directory, we should cd to that directory.
TESTRUN_CWD = $$DESTDIR
debug_and_release:debug_and_release_target {
# But in debug-and-release-target mode we don't want to cd into the debug/release
# directory (e.g. if the test goes to foo/release/tst_thing.exe, we want to do
# 'cd foo && release/tst_thing.exe', not 'cd foo/release && tst_thing.exe').
TESTRUN_CWD ~= s/(release|debug)$//
TEST_TARGET_DIR = $$relative_path($$absolute_path($$DESTDIR, $$OUT_PWD), $$absolute_path($$TESTRUN_CWD, $$OUT_PWD))
}
# Allow for a custom test runner script
check.commands += $(TESTRUNNER)
unix {
isEmpty(TEST_TARGET_DIR): TEST_TARGET_DIR = .
app_bundle: \
check.commands += $${TEST_TARGET_DIR}/$(QMAKE_TARGET).app/Contents/MacOS/$(QMAKE_TARGET)
else: \
check.commands += $${TEST_TARGET_DIR}/$(QMAKE_TARGET)
} else {
# Windows
!isEmpty(TEST_TARGET_DIR): TEST_TARGET_DIR = $${TEST_TARGET_DIR}$${QMAKE_DIR_SEP}
check.commands += $${TEST_TARGET_DIR}$(TARGET)
}
# Allow for custom arguments to tests
check.commands += $(TESTARGS)
!isEmpty(TESTRUN_CWD):!contains(TESTRUN_CWD, ^\\./?): \
check.commands = cd $$shell_path($$TESTRUN_CWD) && $$check.commands
# If the test is marked as insignificant, discard the exit code
insignificant_test:check.commands = -$${check.commands}
QMAKE_EXTRA_TARGETS *= check
isEmpty(BUILDS)|build_pass {
check.depends = first
} else {
# For exclusive builds, only run the test once.
check.CONFIG = recursive
check.target = check_all
check.recurse_target = check
check.commands =
check_first.depends = $$eval($$first(BUILDS).target)-check
check_first.target = check
QMAKE_EXTRA_TARGETS += check_first
}
!no_testcase_installs:!contains(INSTALLS, target) {
# Install tests unless no_testcase_installs is set, or there is already
# a `target' in INSTALLS.
#
# Tests are installed under a directory named after the target so that each
# test has its own directory for testdata etc.
#
load(resolve_target)
TARGET_BASENAME = $$basename(QMAKE_RESOLVED_TARGET)
target.path = $$[QT_INSTALL_TESTS]/$$TARGET_BASENAME
INSTALLS += target
}
!builtin_testdata:contains(INSTALLS, target) {
# Install testdata and helpers as well, but only if we're actually installing the test.
#
# Testdata is installed relative to the directory containing the testcase
# binary itself, e.g. this:
#
# CONFIG += testcase
# TARGET = tst_qxmlreader
#
# TESTDATA += testdata/test1.xml testdata/test2.xml
#
# ... will result in:
#
# /usr/lib/qt5/tests/tst_qxmlreader/tst_qxmlreader
# /usr/lib/qt5/tests/tst_qxmlreader/testdata/test1.xml
# /usr/lib/qt5/tests/tst_qxmlreader/testdata/test2.xml
# ...
#
for(file, TESTDATA) {
tnam = $$file
tnam ~= s,\\.\\.,dotdot,
tnam ~= s,[?*],wildcard,
tnam ~= s,[^A-Za-z0-9],_,
tdi = testdata_$$tnam
tdif = $${tdi}.files
tdip = $${tdi}.path
# TESTDATA consists of the files to install (source)...
$$tdif = $$file
# ... and the destination preserves the relative path.
# Strip any leading ../ from the testdata, so that installation does not escape
# the test's directory in the case of e.g.
#
# TARGET = ../tst_qprocess
# TESTDATA = ../thing1 ../thing2
#
# The testdata should end up at $$[QT_INSTALL_TESTS]/tst_qprocess/thing1,
# rather than $$[QT_INSTALL_TESTS]/tst_qprocess/../thing1.
#
# Note that this does not guarantee the same relative path between test binary
# and testdata in the build and install tree, but should cover most cases.
#
file = $$replace(file, ^(\\.\\./)+, )
$$tdip = $${target.path}/$$dirname(file)
INSTALLS += $$tdi
}
# Install GENERATED_TESTDATA.
# Logic is copied from the TESTDATA installation, only difference being that
# INSTALL target is added with CONFIG = no_check_exist
for(file, GENERATED_TESTDATA) {
tnam = $$file
tnam ~= s,\\.\\.,dotdot,
tnam ~= s,[?*],wildcard,
tnam ~= s,[^A-Za-z0-9],_,
tdi = testdata_$$tnam
tdif = $${tdi}.files
tdip = $${tdi}.path
tdic = $${tdi}.CONFIG
$$tdif = $$file
$$tdic = no_check_exist
file = $$replace(file, ^(\\.\\./)+, )
$$tdip = $${target.path}/$$dirname(file)
INSTALLS += $$tdi
}
# TEST_HELPER_INSTALLS specifies additional test helper executables for installation.
#
# Typical usage is:
#
# TEST_HELPER_INSTALLS += ../some/helper1 ../some/helper2
#
# Resulting in the test helpers being installed to:
#
# $$[QT_INSTALL_TESTS]/$$TARGET/some/helper1
# $$[QT_INSTALL_TESTS]/$$TARGET/some/helper2
#
win32: extension = .exe
for(test_helper, TEST_HELPER_INSTALLS) {
test_helper_dir = $$dirname(test_helper)
output = $$basename(test_helper_dir)
target = $$basename(test_helper)
targetName = $$replace(target, ' ', '_') # handle spaces in name
subTarget = $${targetName}.target
subInstall = $${targetName}_install
subConfig = $${subInstall}.CONFIG
subFiles = $${subInstall}.files
subPath = $${subInstall}.path
$$subTarget = $${output}/$${target}$${extension}
$$subFiles = $${OUT_PWD}/$${test_helper}$${extension}
$$subPath = $${target.path}/$${output}
$$subConfig += no_check_exist executable
INSTALLS += $${subInstall}
}
}
builtin_testdata {
ALL_TESTDATA = $$TESTDATA $$GENERATED_TESTDATA
# RESOURCES does not support wildcards (for good reasons)
for(td, ALL_TESTDATA): \
testdata.files += $$files($$absolute_path($$td, $$_PRO_FILE_PWD_))
!isEmpty(testdata.files) {
testdata.base = $$_PRO_FILE_PWD_
RESOURCES += testdata
}
!isEmpty(TEST_HELPER_INSTALLS): \
error("This platform does not support tests which require helpers.")
}
macx-xcode:bundle:isEmpty(QMAKE_BUNDLE_EXTENSION) {
QMAKE_PBX_PRODUCT_TYPE = com.apple.product-type.bundle.unit-test
QMAKE_PBX_BUNDLE_TYPE = wrapper.cfbundle
QMAKE_BUNDLE_EXTENSION = .xctest
}
} # have_target