qt5base-lts/mkspecs/features/testcase.prf
Tor Arne Vestbø 7044409c87 macOS: Use tool environment to ensure tests load matching Qt libraries
Linking with a framework suffix to pick up the debug version of
libraries doesn't work as long as the dependencies picked up from prl
files are not rewritten to also include the suffix. The result is that
we end up loading both release and debug versions of the Qt libraries.

Use the target environment (target_wrapper.sh) to set the image suffix
instead, which means 'make check' will automatically work.

Change-Id: I60b0840760f68e579c270245d394e1dd609a0ebb
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
2019-01-12 12:18:36 +00:00

234 lines
7.8 KiB
Plaintext

!have_target: return()
# 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
# Set in qt_build_config.prf
testcase_no_bundle: CONFIG -= app_bundle
# Allow testcases to mark themselves as not supporting high-DPI
testcase_lowdpi {
macos {
!isEmpty(QMAKE_INFO_PLIST): \
error("QMAKE_INFO_PLIST already set, can't apply testcase_lowdpi")
QMAKE_INFO_PLIST = $$QMAKESPEC/Info.plist.disable_highdpi
} else {
# TODO: Add support for other platforms if possible
}
}
benchmark: type = benchmark
else: type = check
$${type}.files =
$${type}.path = .
# Make sure we explicitly load the debug version of the Qt libraries if needed
macos {
dyld_image_suffix.name = DYLD_IMAGE_SUFFIX
dyld_image_suffix.value = $$qtPlatformTargetSuffix()
QT_TOOL_ENV += dyld_image_suffix
}
# 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($${type}.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
$${type}.commands += $(TESTRUNNER)
unix {
isEmpty(TEST_TARGET_DIR): TEST_TARGET_DIR = .
app_bundle: \
$${type}.commands += $${TEST_TARGET_DIR}/$(QMAKE_TARGET).app/Contents/MacOS/$(QMAKE_TARGET)
else: \
$${type}.commands += $${TEST_TARGET_DIR}/$(QMAKE_TARGET)
} else {
# Windows
!isEmpty(TEST_TARGET_DIR): TEST_TARGET_DIR = $$shell_path($$TEST_TARGET_DIR)$${QMAKE_DIR_SEP}
$${type}.commands += $${TEST_TARGET_DIR}$(TARGET)
}
# Allow for custom arguments to tests
$${type}.commands += $(TESTARGS)
!isEmpty(TESTRUN_CWD):!contains(TESTRUN_CWD, ^\\./?): \
$${type}.commands = $$QMAKE_CD $$shell_path($$TESTRUN_CWD) && $$eval($${type}.commands)
# If the test is marked as insignificant, discard the exit code
insignificant_test: $${type}.commands = -$$eval($${type}.commands)
QMAKE_EXTRA_TARGETS *= $${type}
isEmpty(BUILDS)|build_pass {
$${type}.depends = first
} else {
# For exclusive builds, only run the test once.
$${type}.CONFIG = recursive
$${type}.target = $${type}_all
$${type}.recurse_target = $${type}
$${type}.commands =
$${type}_first.depends = $$eval($$first(BUILDS).target)-$${type}
$${type}_first.target = $${type}
QMAKE_EXTRA_TARGETS += $${type}_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 their source folder
# so that each test has its own directory for testdata etc.
#
TEST_FOLDER = $$basename(_PRO_FILE_PWD_)
target.path = $$[QT_INSTALL_TESTS]/$$TEST_FOLDER
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
# TESTDATA consists of the files to install (source)...
$${tdi}.files = $$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, ^(\\.\\./)+, )
$${tdi}.path = $${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
$${tdi}.files = $$file
$${tdi}.CONFIG = no_check_exist
file = $$replace(file, ^(\\.\\./)+, )
$${tdi}.path = $${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 {
# RESOURCES does not support wildcards (for good reasons)
for (td, TESTDATA): \
testdata.files += $$files($$absolute_path($$td, $$_PRO_FILE_PWD_))
# BLACKLIST needs to be added to the testdata
BLACKLISTPATH = $$_PRO_FILE_PWD_/BLACKLIST
exists($$BLACKLISTPATH): \
testdata.files *= $$BLACKLISTPATH
!isEmpty(testdata.files) {
testdata.base = $$_PRO_FILE_PWD_
RESOURCES += testdata
}
# Extra compilers don't create wildcards to start with.
for (td, GENERATED_TESTDATA): \
gentestdata.files += $$absolute_path($$td, $$OUT_PWD)
!isEmpty(gentestdata.files) {
gentestdata.base = $$OUT_PWD
RESOURCES += gentestdata
}
!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
}