d60b71d635
Fix an issue where qmake on macOS will generate a Makefile with a path to a macOS bundle instead of a bundle-less executable in the Makefile's check rule if cmdline is specified before testcase in the CONFIG options. Fixes: QTBUG-80280 Change-Id: Icc9ee1355b0641981ce79526b36f29957e1afb00 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
249 lines
8.7 KiB
Plaintext
249 lines
8.7 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
|
|
|
|
# cmdline may have been specified and not processed yet
|
|
cmdline: 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
|
|
|
|
android: isEmpty($(TESTRUNNER)) {
|
|
APK_PATH = $$shell_path($$OUT_PWD/android-build/$${TARGET}.apk)
|
|
qtPrepareTool(ANDROIDTESTRUNNER, androidtestrunner)
|
|
qtPrepareTool(ANDROIDDEPLOYQT, androiddeployqt)
|
|
isEmpty(ANDROID_DEPLOYMENT_SETTINGS_FILE): ANDROID_DEPLOYMENT_SETTINGS_FILE = $$OUT_PWD/android-$$TARGET-deployment-settings.json
|
|
contains(QMAKE_HOST.os, Windows): extension = .exe
|
|
$${type}.commands = $$ANDROIDTESTRUNNER --androiddeployqt \"$$ANDROIDDEPLOYQT --input $$ANDROID_DEPLOYMENT_SETTINGS_FILE\"
|
|
$${type}.commands += --path \"$$OUT_PWD/android-build\"
|
|
$${type}.commands += --adb \"$$shell_path($${ANDROID_SDK_ROOT}$${QMAKE_DIR_SEP}platform-tools$${QMAKE_DIR_SEP}adb$${extension})\"
|
|
$${type}.commands += --make \"$(MAKE) -f $(MAKEFILE)\"
|
|
$${type}.commands += --apk $$APK_PATH
|
|
} else: $${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: !android: \
|
|
$${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
|
|
}
|
|
|