From 229b5ee99425a41ae1963dc1bb873e0051ba9ccd Mon Sep 17 00:00:00 2001 From: Roger Leigh Date: Sat, 31 Oct 2020 09:39:23 +0000 Subject: GNUInstallDirs: Add dir argument to GNUInstallDirs_get_absolute_install_dir Fixes: #21152 --- Modules/GNUInstallDirs.cmake | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/Modules/GNUInstallDirs.cmake b/Modules/GNUInstallDirs.cmake index 13d067a..888f7b1 100644 --- a/Modules/GNUInstallDirs.cmake +++ b/Modules/GNUInstallDirs.cmake @@ -113,7 +113,7 @@ Macros :: - GNUInstallDirs_get_absolute_install_dir(absvar var) + GNUInstallDirs_get_absolute_install_dir(absvar var dirname) Set the given variable ``absvar`` to the absolute path contained within the variable ``var``. This is to allow the computation of an @@ -121,7 +121,8 @@ Macros above. While this macro is used to compute the various ``CMAKE_INSTALL_FULL_`` variables, it is exposed publicly to allow users who create additional path variables to also compute - absolute paths where necessary, using the same logic. + absolute paths where necessary, using the same logic. ``dirname`` is + the directory name to get, e.g. ``BINDIR``. #]=======================================================================] cmake_policy(PUSH) @@ -334,13 +335,25 @@ mark_as_advanced( ) macro(GNUInstallDirs_get_absolute_install_dir absvar var) + set(GGAID_extra_args ${ARGN}) + list(LENGTH GGAID_extra_args GGAID_extra_arg_count) + if(GGAID_extra_arg_count GREATER 0) + list(GET GGAID_extra_args 0 GGAID_dir) + else() + # Historical behaviour: use ${dir} from caller's scope + set(GGAID_dir "${dir}") + message(AUTHOR_WARNING + "GNUInstallDirs_get_absolute_install_dir called without third argument. " + "Using \${dir} from the caller's scope for compatibility with CMake 3.19 and below.") + endif() + if(NOT IS_ABSOLUTE "${${var}}") # Handle special cases: # - CMAKE_INSTALL_PREFIX == / # - CMAKE_INSTALL_PREFIX == /usr # - CMAKE_INSTALL_PREFIX == /opt/... if("${CMAKE_INSTALL_PREFIX}" STREQUAL "/") - if("${dir}" STREQUAL "SYSCONFDIR" OR "${dir}" STREQUAL "LOCALSTATEDIR" OR "${dir}" STREQUAL "RUNSTATEDIR") + if("${GGAID_dir}" STREQUAL "SYSCONFDIR" OR "${GGAID_dir}" STREQUAL "LOCALSTATEDIR" OR "${GGAID_dir}" STREQUAL "RUNSTATEDIR") set(${absvar} "/${${var}}") else() if (NOT "${${var}}" MATCHES "^usr/") @@ -349,13 +362,13 @@ macro(GNUInstallDirs_get_absolute_install_dir absvar var) set(${absvar} "/${${var}}") endif() elseif("${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/?$") - if("${dir}" STREQUAL "SYSCONFDIR" OR "${dir}" STREQUAL "LOCALSTATEDIR" OR "${dir}" STREQUAL "RUNSTATEDIR") + 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/.*") - if("${dir}" STREQUAL "SYSCONFDIR" OR "${dir}" STREQUAL "LOCALSTATEDIR" OR "${dir}" STREQUAL "RUNSTATEDIR") + 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}}") @@ -366,6 +379,10 @@ macro(GNUInstallDirs_get_absolute_install_dir absvar var) else() set(${absvar} "${${var}}") endif() + + unset(GGAID_dir) + unset(GGAID_extra_arg_count) + unset(GGAID_extra_args) endmacro() # Result directories @@ -388,7 +405,7 @@ foreach(dir MANDIR DOCDIR ) - GNUInstallDirs_get_absolute_install_dir(CMAKE_INSTALL_FULL_${dir} CMAKE_INSTALL_${dir}) + GNUInstallDirs_get_absolute_install_dir(CMAKE_INSTALL_FULL_${dir} CMAKE_INSTALL_${dir} ${dir}) endforeach() cmake_policy(POP) -- cgit v0.12 From a61007b3b0d7e70f48521e6e35c98f7c7b8b259c Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 4 Nov 2020 15:05:51 -0500 Subject: Tests: Add RunCMake.GNUInstallDirs case for get_absolute_install_dir --- Tests/RunCMake/GNUInstallDirs/GetAbs-stderr.txt | 12 ++++++++++++ Tests/RunCMake/GNUInstallDirs/GetAbs.cmake | 11 +++++++++++ Tests/RunCMake/GNUInstallDirs/RunCMakeTest.cmake | 1 + 3 files changed, 24 insertions(+) create mode 100644 Tests/RunCMake/GNUInstallDirs/GetAbs-stderr.txt create mode 100644 Tests/RunCMake/GNUInstallDirs/GetAbs.cmake diff --git a/Tests/RunCMake/GNUInstallDirs/GetAbs-stderr.txt b/Tests/RunCMake/GNUInstallDirs/GetAbs-stderr.txt new file mode 100644 index 0000000..ec9a2dd --- /dev/null +++ b/Tests/RunCMake/GNUInstallDirs/GetAbs-stderr.txt @@ -0,0 +1,12 @@ +^PROJ1_FULL_BINDIR='/usr/bin' +CMake Warning \(dev\) at [^ +]*/Modules/GNUInstallDirs.cmake:[0-9]+ \(message\): + GNUInstallDirs_get_absolute_install_dir called without third argument. + Using \${dir} from the caller's scope for compatibility with CMake 3.19 and + below. +Call Stack \(most recent call first\): + GetAbs.cmake:10 \(GNUInstallDirs_get_absolute_install_dir\) + CMakeLists.txt:3 \(include\) +This warning is for project developers. Use -Wno-dev to suppress it. ++ +PROJ2_FULL_BINDIR='/usr/bin'$ diff --git a/Tests/RunCMake/GNUInstallDirs/GetAbs.cmake b/Tests/RunCMake/GNUInstallDirs/GetAbs.cmake new file mode 100644 index 0000000..7d5bfc8 --- /dev/null +++ b/Tests/RunCMake/GNUInstallDirs/GetAbs.cmake @@ -0,0 +1,11 @@ +set(CMAKE_SIZEOF_VOID_P 8) +set(CMAKE_LIBRARY_ARCHITECTURE "arch") +set(CMAKE_INSTALL_PREFIX /usr) +include(GNUInstallDirs) + +GNUInstallDirs_get_absolute_install_dir(PROJ1_FULL_BINDIR CMAKE_INSTALL_BINDIR BINDIR) +message("PROJ1_FULL_BINDIR='${PROJ1_FULL_BINDIR}'") + +set(dir BINDIR) +GNUInstallDirs_get_absolute_install_dir(PROJ2_FULL_BINDIR CMAKE_INSTALL_BINDIR) +message("PROJ2_FULL_BINDIR='${PROJ2_FULL_BINDIR}'") diff --git a/Tests/RunCMake/GNUInstallDirs/RunCMakeTest.cmake b/Tests/RunCMake/GNUInstallDirs/RunCMakeTest.cmake index 529e10a..395ff30 100644 --- a/Tests/RunCMake/GNUInstallDirs/RunCMakeTest.cmake +++ b/Tests/RunCMake/GNUInstallDirs/RunCMakeTest.cmake @@ -21,4 +21,5 @@ foreach(case unset(RunCMake-stderr-file) endforeach() +run_cmake(GetAbs) run_cmake(NoSystem) -- cgit v0.12