Revision control

++ !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
++ # Needs to be bundle so that Launch Services will pick
++ # up and apply the NSHighResolutionCapable=NO state.
++ CONFIG += app_bundle
++
++ } else {
++ # TODO: Add support for other platforms if possible
++ }
++
++ DEFINES += TESTCASE_LOWDPI
++ }
++
++ 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)) {
++ build_pass|single_android_abi {
++ 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 --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) apk\"
++ $${type}.commands += --apk $$APK_PATH
++ # Allow for custom arguments to tests
++ !catch: $${type}.commands += $(TESTARGS)
++ $${type}.commands += "--"
++ for(import, IMPORTPATH): $${type}.commands *= -import \"assets:/$$basename(_PRO_FILE_PWD_)/$$import\"
++ } else {
++ $${type}.commands = "echo \"Pass\""
++ }
++ } 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
++ !catch: $${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
++ }
++