From 2e88a3efc2b52da02f516fdfc8fe97aea0b14e4c Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Wed, 10 Sep 2025 17:11:23 +0200 Subject: [PATCH] GNUInstallDirs: Fix regression on -DCMAKE_INSTALL_= in /usr Fix commit 9789f7d05e (GNUInstallDirs: Add internal helper to compute specific defaults, 2025-03-28, v4.1.0-rc1~384^2~3) to avoid updating explicitly-specified cache entries on the first run. Do not reset the default value until at least the second run, during which we have `_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX` already defined. Fixes: #27211 --- Modules/GNUInstallDirs.cmake | 8 +++++--- ...ults.cmake => ExplicitDefaults-Common.cmake} | 1 - .../ExplicitDefaults-Opt-stdout.txt | 6 ++++++ .../GNUInstallDirs/ExplicitDefaults-Opt.cmake | 2 ++ .../ExplicitDefaults-Root-stdout.txt | 6 ++++++ .../GNUInstallDirs/ExplicitDefaults-Root.cmake | 2 ++ .../ExplicitDefaults-Usr-stdout.txt | 6 ++++++ .../GNUInstallDirs/ExplicitDefaults-Usr.cmake | 2 ++ ...txt => ExplicitDefaults-UsrLocal-stdout.txt} | 0 .../ExplicitDefaults-UsrLocal.cmake | 2 ++ .../RunCMake/GNUInstallDirs/RunCMakeTest.cmake | 17 ++++++++++++----- 11 files changed, 43 insertions(+), 9 deletions(-) rename Tests/RunCMake/GNUInstallDirs/{ExplicitDefaults.cmake => ExplicitDefaults-Common.cmake} (90%) create mode 100644 Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Opt-stdout.txt create mode 100644 Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Opt.cmake create mode 100644 Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Root-stdout.txt create mode 100644 Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Root.cmake create mode 100644 Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Usr-stdout.txt create mode 100644 Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Usr.cmake rename Tests/RunCMake/GNUInstallDirs/{ExplicitDefaults-stdout.txt => ExplicitDefaults-UsrLocal-stdout.txt} (100%) create mode 100644 Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-UsrLocal.cmake diff --git a/Modules/GNUInstallDirs.cmake b/Modules/GNUInstallDirs.cmake index ff9c11a9d7..f677c27ff3 100644 --- a/Modules/GNUInstallDirs.cmake +++ b/Modules/GNUInstallDirs.cmake @@ -257,15 +257,16 @@ function(_GNUInstallDirs_cache_path var description) if(COMMAND _GNUInstallDirs_${var}_get_default) # Check if the current CMAKE_INSTALL_PREFIX is the same as before set(install_prefix_is_same TRUE) - set(last_default "${default}") - if(NOT DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX - OR NOT _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX STREQUAL CMAKE_INSTALL_PREFIX) + unset(last_default) + if(DEFINED _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX + AND NOT _GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX STREQUAL CMAKE_INSTALL_PREFIX) set(install_prefix_is_same FALSE) # Recalculate what the last default would have been cmake_language(CALL _GNUInstallDirs_${var}_get_default last_default "${_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX}") endif() + if(DEFINED CACHE{${cmake_install_var}} AND install_prefix_is_same) # If the cache variable was already set from a previous run and the # install prefix has not changed, we don't need to do anything @@ -278,6 +279,7 @@ function(_GNUInstallDirs_cache_path var description) # if the current value is the same as the cache value and the same as # the old default, reset the value to the new default if(${cmake_install_var} STREQUAL "$CACHE{${cmake_install_var}}" + AND DEFINED last_default AND ${cmake_install_var} STREQUAL last_default) set(full_description "${description} (${default})") set_property(CACHE ${cmake_install_var} PROPERTY TYPE PATH) diff --git a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults.cmake b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Common.cmake similarity index 90% rename from Tests/RunCMake/GNUInstallDirs/ExplicitDefaults.cmake rename to Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Common.cmake index 9aca043cd1..7b19783423 100644 --- a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults.cmake +++ b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Common.cmake @@ -1,6 +1,5 @@ set(CMAKE_SIZEOF_VOID_P 8) set(CMAKE_LIBRARY_ARCHITECTURE "arch") -set(CMAKE_INSTALL_PREFIX "/usr/local") include(GNUInstallDirs) set(dirs BINDIR diff --git a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Opt-stdout.txt b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Opt-stdout.txt new file mode 100644 index 0000000000..a22c5650a0 --- /dev/null +++ b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Opt-stdout.txt @@ -0,0 +1,6 @@ +-- CMAKE_INSTALL_BINDIR='bin' +-- CMAKE_INSTALL_INCLUDEDIR='include' +-- CMAKE_INSTALL_LIBDIR='lib' +-- CMAKE_INSTALL_FULL_BINDIR='/opt/bin' +-- CMAKE_INSTALL_FULL_INCLUDEDIR='/opt/include' +-- CMAKE_INSTALL_FULL_LIBDIR='/opt/lib' diff --git a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Opt.cmake b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Opt.cmake new file mode 100644 index 0000000000..86c9ccbc06 --- /dev/null +++ b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Opt.cmake @@ -0,0 +1,2 @@ +set(CMAKE_INSTALL_PREFIX "/opt") +include(ExplicitDefaults-Common.cmake) diff --git a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Root-stdout.txt b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Root-stdout.txt new file mode 100644 index 0000000000..6dc864bd6d --- /dev/null +++ b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Root-stdout.txt @@ -0,0 +1,6 @@ +-- CMAKE_INSTALL_BINDIR='bin' +-- CMAKE_INSTALL_INCLUDEDIR='include' +-- CMAKE_INSTALL_LIBDIR='lib' +-- CMAKE_INSTALL_FULL_BINDIR='/usr/bin' +-- CMAKE_INSTALL_FULL_INCLUDEDIR='/usr/include' +-- CMAKE_INSTALL_FULL_LIBDIR='/usr/lib' diff --git a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Root.cmake b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Root.cmake new file mode 100644 index 0000000000..1a9599760c --- /dev/null +++ b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Root.cmake @@ -0,0 +1,2 @@ +set(CMAKE_INSTALL_PREFIX "/") +include(ExplicitDefaults-Common.cmake) diff --git a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Usr-stdout.txt b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Usr-stdout.txt new file mode 100644 index 0000000000..6dc864bd6d --- /dev/null +++ b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Usr-stdout.txt @@ -0,0 +1,6 @@ +-- CMAKE_INSTALL_BINDIR='bin' +-- CMAKE_INSTALL_INCLUDEDIR='include' +-- CMAKE_INSTALL_LIBDIR='lib' +-- CMAKE_INSTALL_FULL_BINDIR='/usr/bin' +-- CMAKE_INSTALL_FULL_INCLUDEDIR='/usr/include' +-- CMAKE_INSTALL_FULL_LIBDIR='/usr/lib' diff --git a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Usr.cmake b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Usr.cmake new file mode 100644 index 0000000000..ca076b842c --- /dev/null +++ b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-Usr.cmake @@ -0,0 +1,2 @@ +set(CMAKE_INSTALL_PREFIX "/usr") +include(ExplicitDefaults-Common.cmake) diff --git a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-stdout.txt b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-UsrLocal-stdout.txt similarity index 100% rename from Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-stdout.txt rename to Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-UsrLocal-stdout.txt diff --git a/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-UsrLocal.cmake b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-UsrLocal.cmake new file mode 100644 index 0000000000..d9f965a683 --- /dev/null +++ b/Tests/RunCMake/GNUInstallDirs/ExplicitDefaults-UsrLocal.cmake @@ -0,0 +1,2 @@ +set(CMAKE_INSTALL_PREFIX "/usr/local") +include(ExplicitDefaults-Common.cmake) diff --git a/Tests/RunCMake/GNUInstallDirs/RunCMakeTest.cmake b/Tests/RunCMake/GNUInstallDirs/RunCMakeTest.cmake index cd0ffa8143..7c087f221f 100644 --- a/Tests/RunCMake/GNUInstallDirs/RunCMakeTest.cmake +++ b/Tests/RunCMake/GNUInstallDirs/RunCMakeTest.cmake @@ -40,8 +40,15 @@ endblock() run_cmake(GetAbs) run_cmake(NoSystem) -run_cmake_with_options(ExplicitDefaults - -DCMAKE_INSTALL_BINDIR=bin - -DCMAKE_INSTALL_INCLUDEDIR=include - -DCMAKE_INSTALL_LIBDIR=lib -) +foreach(case + Opt + Root + Usr + UsrLocal + ) + run_cmake_with_options(ExplicitDefaults-${case} + -DCMAKE_INSTALL_BINDIR=bin + -DCMAKE_INSTALL_INCLUDEDIR=include + -DCMAKE_INSTALL_LIBDIR=lib + ) +endforeach()