From b9b5ed3aa607f644cf32b5798ac742442de9fe3e Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Tue, 4 Jul 2023 17:47:14 +0200 Subject: [PATCH] CMake: Don't set QT_BUILDING_QT for single standalone tests Standalone test projects have the following condition in the beginning of their project: if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) find_package(Qt6BuildInternals COMPONENT STANDALONE_TEST) endif() When configuring the project the first time, QT_BUILDING_QT is not set, find_package is called, configuration succeeds. But because standalone projects implicitly include QtSetup.cmake, that file sets the QT_BUILDING_QT cache var to true, and upon test reconfiguration, cmake errors out with: Unknown CMake command "qt_internal_add_test" or similar. This happens because QT_BUILDING_QT is true on the second reconfiguration and the find_package mentioned above is not executed anymore, leading to unknown internal command errors. Set a new QT_INTERNAL_IS_STANDALONE_TEST variable when we detect a standalone test and check for its value in QtSetup so we don't set QT_BUILDING_QT to TRUE anymore. Adjust a few code locations where QT_BUILDING_QT being false might trigger different behavior for standalone tests. Task-number: QTBUG-93020 Change-Id: I5413b9f37653225175a1006f7626e023045b5979 Reviewed-by: Qt CI Bot Reviewed-by: Joerg Bornemann Reviewed-by: Thiago Macieira Reviewed-by: Amir Masoud Abdol --- .../QtStandaloneTestTemplateProject/Main.cmake | 1 + cmake/QtSetup.cmake | 12 +++++++++--- src/corelib/Qt6AndroidMacros.cmake | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/cmake/QtBuildInternals/QtStandaloneTestTemplateProject/Main.cmake b/cmake/QtBuildInternals/QtStandaloneTestTemplateProject/Main.cmake index c7222c8b718..3d5117d9232 100644 --- a/cmake/QtBuildInternals/QtStandaloneTestTemplateProject/Main.cmake +++ b/cmake/QtBuildInternals/QtStandaloneTestTemplateProject/Main.cmake @@ -2,6 +2,7 @@ # SPDX-License-Identifier: BSD-3-Clause # Includes QtSetup and friends for private CMake API. +set(QT_INTERNAL_IS_STANDALONE_TEST TRUE) qt_internal_project_setup() qt_build_internals_set_up_private_api() diff --git a/cmake/QtSetup.cmake b/cmake/QtSetup.cmake index f9ddd87313e..98acc11f4e4 100644 --- a/cmake/QtSetup.cmake +++ b/cmake/QtSetup.cmake @@ -3,10 +3,16 @@ ## Set a default build type if none was specified -# Set the QT_IS_BUILDING_QT variable so we can verify whether we are building -# Qt from source -set(QT_BUILDING_QT TRUE CACHE BOOL +# Set the QT_BUILDING_QT variable so we can verify whether we are building +# Qt from source. +# Make sure not to set it when building a standalone test, otherwise +# upon reconfiguration we get an error about qt_internal_add_test +# not being found due the if(NOT QT_BUILDING_QT) check we have +# in each standalone test. +if(NOT QT_INTERNAL_IS_STANDALONE_TEST) + set(QT_BUILDING_QT TRUE CACHE BOOL "When this is present and set to true, it signals that we are building Qt from source.") +endif() # Pre-calculate the developer_build feature if it's set by the user via INPUT_developer_build if(NOT FEATURE_developer_build AND INPUT_developer_build diff --git a/src/corelib/Qt6AndroidMacros.cmake b/src/corelib/Qt6AndroidMacros.cmake index 7d8312f5b8a..c7e31f621fc 100644 --- a/src/corelib/Qt6AndroidMacros.cmake +++ b/src/corelib/Qt6AndroidMacros.cmake @@ -898,7 +898,7 @@ endfunction() # It doesn't overwrite public properties, but instead writes formatted values to internal # properties. function(_qt_internal_android_format_deployment_paths target) - if(QT_BUILD_STANDALONE_TESTS OR QT_BUILDING_QT) + if(QT_BUILD_STANDALONE_TESTS OR QT_BUILDING_QT OR QT_INTERNAL_IS_STANDALONE_TEST) set(android_deployment_paths_policy NEW) else() __qt_internal_setup_policy(QTP0002 "6.6.0" @@ -1008,7 +1008,7 @@ function(_qt_internal_get_android_abi_cmake_dir_path out_path abi) else() _qt_internal_get_android_abi_prefix_path(prefix_path ${abi}) if((PROJECT_NAME STREQUAL "QtBase" OR QT_SUPERBUILD) AND QT_BUILDING_QT AND - NOT QT_BUILD_STANDALONE_TESTS) + NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_INTERNAL_IS_STANDALONE_TEST) set(cmake_dir "${QT_CONFIG_BUILD_DIR}") else() set(cmake_dir "${prefix_path}/${QT6_INSTALL_LIBS}/cmake")