From 7566a477f7b2c9a8d72c2a8fcf4d91d39f834067 Mon Sep 17 00:00:00 2001 From: Cristian Le Date: Thu, 27 Mar 2025 19:57:42 +0100 Subject: [PATCH] GNUInstallDirs: Factor out helper for special absolute path logic Factor out part of `GNUInstallDirs_get_absolute_install_dir` into a dedicated `_GNUInstallDirs_special_absolute` helper. Signed-off-by: Cristian Le --- Modules/GNUInstallDirs.cmake | 46 ++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/Modules/GNUInstallDirs.cmake b/Modules/GNUInstallDirs.cmake index 56d9c4346b..6992a888e4 100644 --- a/Modules/GNUInstallDirs.cmake +++ b/Modules/GNUInstallDirs.cmake @@ -263,6 +263,20 @@ function(_GNUInstallDirs_get_system_type_for_install out_var) return(PROPAGATE ${out_var}) endfunction() +# Special handler for `/`, `/usr`, `/opt/...` install prefixes +# Used for SYSCONFDIR, LOCALSTATEDIR and RUNSTATEDIR paths +function(_GNUInstallDirs_special_absolute out_var original_path install_prefix) + set(${out_var} "${original_path}") + + if(install_prefix MATCHES "^/usr/?$") + set(${out_var} "/${original_path}") + elseif(install_prefix MATCHES "^/opt/" AND NOT install_prefix MATCHES "^/opt/homebrew/") + set(${out_var} "/${original_path}/${install_prefix}") + endif() + + return(PROPAGATE ${out_var}) +endfunction() + # Installation directories # @@ -449,27 +463,23 @@ macro(GNUInstallDirs_get_absolute_install_dir absvar var) # - CMAKE_INSTALL_PREFIX == / # - CMAKE_INSTALL_PREFIX == /usr # - CMAKE_INSTALL_PREFIX == /opt/... - if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/") - if("${GGAID_dir}" STREQUAL "SYSCONFDIR" OR "${GGAID_dir}" STREQUAL "LOCALSTATEDIR" OR "${GGAID_dir}" STREQUAL "RUNSTATEDIR") - set(${absvar} "/${${var}}") - else() - if (NOT "${${var}}" MATCHES "^usr/") - set(${var} "usr/${${var}}") + if("${GGAID_dir}" STREQUAL "SYSCONFDIR" OR "${GGAID_dir}" STREQUAL "LOCALSTATEDIR" OR "${GGAID_dir}" STREQUAL "RUNSTATEDIR") + _GNUInstallDirs_special_absolute(${absvar} "${${var}}" "${CMAKE_INSTALL_PREFIX}") + # If the CMAKE_INSTALL_PREFIX was not special, the output + # is still not absolute, so use the default logic. + if(NOT IS_ABSOLUTE "${${absvar}}") + # Make sure we account for any trailing `/` + if(CMAKE_INSTALL_PREFIX MATCHES "/$") + set(${absvar} "${CMAKE_INSTALL_PREFIX}${${var}}") + else() + set(${absvar} "${CMAKE_INSTALL_PREFIX}/${${var}}") endif() - set(${absvar} "/${${var}}") endif() - elseif("${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/?$") - if("${GGAID_dir}" STREQUAL "SYSCONFDIR" OR "${GGAID_dir}" STREQUAL "LOCALSTATEDIR" OR "${GGAID_dir}" STREQUAL "RUNSTATEDIR") - set(${absvar} "/${${var}}") - else() - set(${absvar} "${CMAKE_INSTALL_PREFIX}/${${var}}") - endif() - elseif("${CMAKE_INSTALL_PREFIX}" MATCHES "^/opt/" AND NOT "${CMAKE_INSTALL_PREFIX}" MATCHES "^/opt/homebrew/") - if("${GGAID_dir}" STREQUAL "SYSCONFDIR" OR "${GGAID_dir}" STREQUAL "LOCALSTATEDIR" OR "${GGAID_dir}" STREQUAL "RUNSTATEDIR") - set(${absvar} "/${${var}}${CMAKE_INSTALL_PREFIX}") - else() - set(${absvar} "${CMAKE_INSTALL_PREFIX}/${${var}}") + elseif("${CMAKE_INSTALL_PREFIX}" STREQUAL "/") + if (NOT "${${var}}" MATCHES "^usr/") + set(${var} "usr/${${var}}") endif() + set(${absvar} "/${${var}}") else() set(${absvar} "${CMAKE_INSTALL_PREFIX}/${${var}}") endif()