From c75eadf08e47a001f43ac95f33fd716a81444419 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Tue, 12 Sep 2023 16:57:56 +0200 Subject: [PATCH] CMake: Fix reconfiguration when -no-opengl is specified In a previous change, we ensured that all INPUT_foo cache variables are unset at the end of configuration, so they don't influence feature re-evaluation in case if a command line flag like -no-gui is not specified upon second reconfiguration and a FEATURE_foo is manually toggled in the CMakeCache.txt, effectively getting rid of stale INPUT_foo values. Unfortunately that causes an issue when configuring with -no-opengl and then trying to reconfigure with 'cmake .' Specifically various feature options like ENABLE / DISABLE use INPUT_foo variables in their expressions. qt_configure_add_report_entry CONDITIONs also use them. These expect the INPUT_foo variables to be persisted, and if they are removed, the expressions might be re-evaluated to a different value, and cause re-configuration to fail or unexpectedly toggle features. To support both cases described above, instead of removing all INPUT variables when configuration ends, only unset those INPUT variables whose corresponding FEATURE_foo variable has been manually toggled in CMakeCache.txt or via an IDE. Toggling a FEATURE_foo manually is intentional, which means the INPUT_foo value should be discarded. Whereas pre-existing INPUT_bar variables will persist, thus not breaking cases like the -no-opengl report CONDITION. Amends 2799391703e44a34b6557e234462e425a61785f2 Fixes: QTBUG-116973 Task-number: QTBUG-112957 Change-Id: I5851255bfa41a9a1d116630a5d9f7b9a74aa93ed Reviewed-by: Alexey Edelev (cherry picked from commit d1a17d96550362b28f77a6bbff9dd15b15d40559) Reviewed-by: Qt Cherry-pick Bot --- .../QtBuildInternalsConfig.cmake | 8 ++++--- cmake/QtFeature.cmake | 24 +++++++++---------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake index e8e981542c6..c9b9d317e59 100644 --- a/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake +++ b/cmake/QtBuildInternals/QtBuildInternalsConfig.cmake @@ -106,6 +106,8 @@ endif() include(QtPlatformSupport) # Set FEATURE_${feature} if INPUT_${feature} is set in certain circumstances. +# Set FEATURE_${feature}_computed_from_input to TRUE or FALSE depending on whether the +# INPUT_${feature} value has overridden the FEATURE_${feature} variable. # # Needs to be in QtBuildInternalsConfig.cmake instead of QtFeature.cmake because it's used in # qt_build_internals_disable_pkg_config_if_needed. @@ -126,6 +128,9 @@ function(qt_internal_compute_feature_value_from_possible_input feature) endif() set(FEATURE_${feature} "${FEATURE_${feature}}" PARENT_SCOPE) + set(FEATURE_${feature}_computed_from_input TRUE PARENT_SCOPE) + else() + set(FEATURE_${feature}_computed_from_input FALSE PARENT_SCOPE) endif() endfunction() @@ -622,9 +627,6 @@ function(qt_internal_qt_configure_end) # reconfigurations that are done by calling cmake directly don't trigger configure specific # logic. unset(QT_INTERNAL_CALLED_FROM_CONFIGURE CACHE) - - # Clean up stale feature input values. - qt_internal_clean_feature_inputs() endfunction() macro(qt_build_repo) diff --git a/cmake/QtFeature.cmake b/cmake/QtFeature.cmake index 207abd58c97..9620c1df581 100644 --- a/cmake/QtFeature.cmake +++ b/cmake/QtFeature.cmake @@ -883,6 +883,18 @@ function(qt_internal_detect_dirty_features) "to ${FEATURE_${feature}}") set(dirty_build TRUE) set_property(GLOBAL APPEND PROPERTY _qt_dirty_features "${feature}") + + # If the user changed the value of the feature directly (e.g by editing + # CMakeCache.txt), and not via its associated INPUT variable, unset the INPUT cache + # variable before it is used in feature evaluation, to ensure a stale value doesn't + # influence other feature values, especially when QT_INTERNAL_CALLED_FROM_CONFIGURE + # is TRUE and the INPUT_foo variable is not passed. + # e.g. first configure -no-gui, then manually toggle FEATURE_gui to ON in + # CMakeCache.txt, then reconfigure (with the configure script) without -no-gui. + # Without this unset(), we'd have switched FEATURE_gui to OFF again. + if(NOT FEATURE_${feature}_computed_from_input) + unset("INPUT_${feature}" CACHE) + endif() endif() unset("QT_FEATURE_${feature}" CACHE) endforeach() @@ -899,18 +911,6 @@ function(qt_internal_detect_dirty_features) endif() endfunction() -function(qt_internal_clean_feature_inputs) - foreach(feature IN LISTS QT_KNOWN_FEATURES) - # Unset the INPUT_foo cache variables after they were used in feature evaluation, to - # ensure stale values don't influence features upon reconfiguration when - # QT_INTERNAL_CALLED_FROM_CONFIGURE is TRUE and the INPUT_foo variable is not passed. - # e.g. first configure -no-gui, then manually toggle FEATURE_gui to ON in - # CMakeCache.txt, then reconfigure (with the configure script) without -no-gui. - # Without this unset(), we'd have switched FEATURE_gui to OFF again. - unset(INPUT_${feature} CACHE) - endforeach() -endfunction() - function(qt_config_compile_test name) if(DEFINED "TEST_${name}") return()