1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 19:08:07 +08:00

GNUInstallDirs: Add internal helper to compute specific defaults

Create an internal `_GNUInstallDirs_<dir>_get_default` helper and
generalize the logic used to update the `CMAKE_INSTALL_LIBDIR` default.

Signed-off-by: Cristian Le <git@lecris.dev>
This commit is contained in:
Cristian Le
2025-03-28 14:56:23 +01:00
committed by Brad King
parent 83f44bbf53
commit 9789f7d05e

View File

@@ -169,6 +169,39 @@ endfunction()
function(_GNUInstallDirs_cache_path var description) function(_GNUInstallDirs_cache_path var description)
set(cmake_install_var "CMAKE_INSTALL_${var}") set(cmake_install_var "CMAKE_INSTALL_${var}")
set(default "${_GNUInstallDirs_${var}_DEFAULT}") set(default "${_GNUInstallDirs_${var}_DEFAULT}")
# Check if we have a special way to calculate the defaults
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)
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
return()
else()
# Otherwise get the new default
cmake_language(CALL _GNUInstallDirs_${var}_get_default
default
"${CMAKE_INSTALL_PREFIX}")
# 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 ${cmake_install_var} STREQUAL last_default)
set(${cmake_install_var} "${default}" CACHE PATH "${full_description}" FORCE)
endif()
# Continue to normal flow
endif()
endif()
# Normal flow
set(full_description "${description} (${default})") set(full_description "${description} (${default})")
if(NOT DEFINED ${cmake_install_var}) if(NOT DEFINED ${cmake_install_var})
set(${cmake_install_var} "${default}" CACHE PATH "${full_description}") set(${cmake_install_var} "${default}" CACHE PATH "${full_description}")
@@ -182,6 +215,12 @@ endfunction()
function(_GNUInstallDirs_cache_path_fallback var description) function(_GNUInstallDirs_cache_path_fallback var description)
set(cmake_install_var "CMAKE_INSTALL_${var}") set(cmake_install_var "CMAKE_INSTALL_${var}")
set(default "${_GNUInstallDirs_${var}_DEFAULT}") set(default "${_GNUInstallDirs_${var}_DEFAULT}")
# Check if there is a more special way to handle the default
if(COMMAND _GNUInstallDirs_${var}_get_default)
cmake_language(CALL _GNUInstallDirs_${var}_get_default
default
"${CMAKE_INSTALL_PREFIX}")
endif()
if(NOT ${cmake_install_var}) if(NOT ${cmake_install_var})
set(${cmake_install_var} "" CACHE PATH "${description}") set(${cmake_install_var} "" CACHE PATH "${description}")
set(${cmake_install_var} "${default}") set(${cmake_install_var} "${default}")
@@ -239,6 +278,16 @@ set(_GNUInstallDirs_INCLUDEDIR_DEFAULT "include")
set(_GNUInstallDirs_OLDINCLUDEDIR_DEFAULT "/usr/include") set(_GNUInstallDirs_OLDINCLUDEDIR_DEFAULT "/usr/include")
set(_GNUInstallDirs_DATAROOTDIR_DEFAULT "share") set(_GNUInstallDirs_DATAROOTDIR_DEFAULT "share")
# Define the special defaults handling
# Signature
# _GNUInstallDirs_<Dir>_get_default(out_var install_prefix)
#
# ``out_var``
# Output variable with the calculated default
#
# ``install_prefix``
# The CMAKE_INSTALL_PREFIX used to calculate the default
# We check if the variable was manually set and not cached, in order to # We check if the variable was manually set and not cached, in order to
# allow projects to set the values as normal variables before including # allow projects to set the values as normal variables before including
# GNUInstallDirs to avoid having the entries cached or user-editable. It # GNUInstallDirs to avoid having the entries cached or user-editable. It
@@ -325,8 +374,6 @@ if(NOT DEFINED CMAKE_INSTALL_LIBDIR OR (_libdir_set
endif() endif()
_GNUInstallDirs_cache_convert_to_path(CMAKE_INSTALL_LIBDIR "Object code libraries (lib)") _GNUInstallDirs_cache_convert_to_path(CMAKE_INSTALL_LIBDIR "Object code libraries (lib)")
# Save for next run
set(_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE INTERNAL "CMAKE_INSTALL_PREFIX during last run")
unset(_libdir_set) unset(_libdir_set)
unset(__LAST_LIBDIR_DEFAULT) unset(__LAST_LIBDIR_DEFAULT)
@@ -411,6 +458,9 @@ foreach(dir IN ITEMS
unset(_GNUInstallDirs_${dir}_DEFAULT) unset(_GNUInstallDirs_${dir}_DEFAULT)
endforeach() endforeach()
# Save for next run
set(_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE INTERNAL "CMAKE_INSTALL_PREFIX during last run")
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
mark_as_advanced( mark_as_advanced(