From 70464b355ec1c7007e0b1291f733e2540ba1825f Mon Sep 17 00:00:00 2001 From: Alexey Edelev Date: Wed, 24 Mar 2021 12:58:08 +0100 Subject: [PATCH] Specify QT_TESTCASE_BUILDDIR for Qt::Test users implicitly QT_TESTCASE_BUILDDIR was implicitly defined by Qt::Test target for library users in Qt5. By default, this definition will point to CMAKE_CURRENT_BINARY_DIR. This logic works similarly to qmake logic. From user's perspective it might be useful to not rely on standard search paths, but specify own. This can be done by setting the QT_TESTCASE_BUILDDIR property for the user's target. CMake will substute the value of the QT_TESTCASE_BUILDDIR property into the QT_TESTCASE_BUILDDIR definition. The implicit QT_TESTCASE_SOURCEDIR also seems to be useful. According to the current logic, it points to CMAKE_CURRENT_SOURCE_DIR. Fixes: QTBUG-92079 Change-Id: I8a9065f08e859c713b3c8cc08142a9ced0677770 Reviewed-by: Alexandru Croitor --- cmake/QtTestHelpers.cmake | 2 - src/testlib/CMakeLists.txt | 10 ++++ src/testlib/qtestcase.qdoc | 4 ++ tests/auto/cmake/CMakeLists.txt | 4 ++ .../test_QFINDTESTDATA/tests/CMakeLists.txt | 2 - .../test_QT_TESTCASE_BUILDDIR/CMakeLists.txt | 20 +++++++ .../data/testdata.txt | 1 + .../cmake/test_QT_TESTCASE_BUILDDIR/main.cpp | 57 +++++++++++++++++++ .../test_QT_TESTCASE_BUILDDIR/testdata.txt | 1 + 9 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/CMakeLists.txt create mode 100644 tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/data/testdata.txt create mode 100644 tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/main.cpp create mode 100644 tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/testdata.txt diff --git a/cmake/QtTestHelpers.cmake b/cmake/QtTestHelpers.cmake index 639c515dc7..cad4d6ecf9 100644 --- a/cmake/QtTestHelpers.cmake +++ b/cmake/QtTestHelpers.cmake @@ -221,8 +221,6 @@ function(qt_internal_add_test name) INCLUDE_DIRECTORIES ${private_includes} DEFINES - QT_TESTCASE_BUILDDIR="${CMAKE_CURRENT_BINARY_DIR}" - QT_TESTCASE_SOURCEDIR="${CMAKE_CURRENT_SOURCE_DIR}" ${arg_DEFINES} PUBLIC_LIBRARIES ${QT_CMAKE_EXPORT_NAMESPACE}::Core ${QT_CMAKE_EXPORT_NAMESPACE}::Test ${arg_PUBLIC_LIBRARIES} LIBRARIES ${arg_LIBRARIES} diff --git a/src/testlib/CMakeLists.txt b/src/testlib/CMakeLists.txt index a2307045e7..da53bb8b68 100644 --- a/src/testlib/CMakeLists.txt +++ b/src/testlib/CMakeLists.txt @@ -110,6 +110,16 @@ qt_internal_extend_target(Test CONDITION MACOS ${FWIOKit} ) +set(qt_tc_build_dir "$") +set(qt_bool_tc_build_dir "$") +set(qt_tc_build_dir_def + "$>" +) +set_property(TARGET Test PROPERTY INTERFACE_COMPILE_DEFINITIONS + QT_TESTCASE_BUILDDIR="${qt_tc_build_dir_def}" + QT_TESTCASE_SOURCEDIR="$" +) + # special case begin # Do not bother with disabled stuff: # qt_internal_extend_target(Test CONDITION (MACOS) AND (OFF AND NOT lessThan(QMAKE_XCODE_VERSION, "6.0")) ... diff --git a/src/testlib/qtestcase.qdoc b/src/testlib/qtestcase.qdoc index 08f111b43e..2a480fb349 100644 --- a/src/testlib/qtestcase.qdoc +++ b/src/testlib/qtestcase.qdoc @@ -522,6 +522,10 @@ absolute paths to the source files are passed to the compiler. Otherwise, the absolute path of the source directory cannot be determined. + \note The \c{QT_TESTCASE_BUILDDIR} macro is also implicitly defined if CMake is used + and the QtTest module is linked to the target. You can change the default + \c{QT_TESTCASE_BUILDDIR} by setting the QT_TESTCASE_BUILDDIR property on the target. + \note For tests that use the \l QTEST_APPLESS_MAIN() macro to generate a \c{main()} function, \c{QFINDTESTDATA} will not attempt to find test data relative to QCoreApplication::applicationDirPath(). In practice, this means that diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt index 4fb6c24d8d..a94f1a51fe 100644 --- a/tests/auto/cmake/CMakeLists.txt +++ b/tests/auto/cmake/CMakeLists.txt @@ -112,6 +112,10 @@ if (CMAKE_GENERATOR STREQUAL Ninja AND UNIX AND NOT WIN32) BINARY "tests/test_QFINDTESTDATA" SIMULATE_IN_SOURCE ) + _qt_internal_test_expect_pass(test_QT_TESTCASE_BUILDDIR + BINARY "test_qt_testcase_builddir" + SIMULATE_IN_SOURCE + ) endif() if (NOT NO_DBUS) diff --git a/tests/auto/cmake/test_QFINDTESTDATA/tests/CMakeLists.txt b/tests/auto/cmake/test_QFINDTESTDATA/tests/CMakeLists.txt index 6515aa8020..df91a7d84b 100644 --- a/tests/auto/cmake/test_QFINDTESTDATA/tests/CMakeLists.txt +++ b/tests/auto/cmake/test_QFINDTESTDATA/tests/CMakeLists.txt @@ -2,5 +2,3 @@ add_executable(test_QFINDTESTDATA WIN32 main.cpp) target_link_libraries(test_QFINDTESTDATA Qt::Test) -target_compile_definitions(test_QFINDTESTDATA PRIVATE QT_TESTCASE_BUILDDIR="${CMAKE_CURRENT_BINARY_DIR}") -target_compile_definitions(test_QFINDTESTDATA PRIVATE QT_TESTCASE_SOURCEDIR="${CMAKE_CURRENT_SOURCE_DIR}") diff --git a/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/CMakeLists.txt b/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/CMakeLists.txt new file mode 100644 index 0000000000..f6fe597def --- /dev/null +++ b/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/CMakeLists.txt @@ -0,0 +1,20 @@ +# The test is simply testing that manual specification of QT_TESTCASE_BUILDDIR works, +# despite the weird paths. +cmake_minimum_required(VERSION 3.14) + +project(test_qt_testcase_builddir) + +find_package(Qt6Test REQUIRED) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +add_executable(test_qt_testcase_builddir WIN32 main.cpp) + +target_link_libraries(test_qt_testcase_builddir Qt::Test) +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/testdata.txt" + "${CMAKE_CURRENT_BINARY_DIR}/level1/level2/testdata_build.txt" + COPYONLY +) +set_target_properties(test_qt_testcase_builddir PROPERTIES + QT_TESTCASE_BUILDDIR "${CMAKE_CURRENT_BINARY_DIR}/level1/level2" +) diff --git a/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/data/testdata.txt b/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/data/testdata.txt new file mode 100644 index 0000000000..e846386066 --- /dev/null +++ b/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/data/testdata.txt @@ -0,0 +1 @@ +This is the test data found in QT_TESTCASE_SOURCEDIR. diff --git a/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/main.cpp b/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/main.cpp new file mode 100644 index 0000000000..8965e0dac3 --- /dev/null +++ b/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/main.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +class TestClass : public QObject +{ + Q_OBJECT +public: + TestClass(QObject *parent = nullptr) { } + +private slots: + void doTest(); +}; + +void TestClass::doTest() +{ + QFile fsrc(QFINDTESTDATA("data/testdata.txt")); + QVERIFY(fsrc.open(QFile::ReadOnly)); + QCOMPARE(fsrc.readAll().trimmed(), + QByteArrayLiteral("This is the test data found in QT_TESTCASE_SOURCEDIR.")); + + QFile fbuild(QFINDTESTDATA("level2/testdata_build.txt")); + QVERIFY(fbuild.open(QFile::ReadOnly)); + QCOMPARE(fbuild.readAll().trimmed(), + QByteArrayLiteral("This is the test data found in custom QT_TESTCASE_BUILDDIR.")); +} + +QTEST_MAIN(TestClass) +#include "main.moc" diff --git a/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/testdata.txt b/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/testdata.txt new file mode 100644 index 0000000000..96a369071b --- /dev/null +++ b/tests/auto/cmake/test_QT_TESTCASE_BUILDDIR/testdata.txt @@ -0,0 +1 @@ +This is the test data found in custom QT_TESTCASE_BUILDDIR.