diff --git a/kde-modules/KDEInstallDirs.cmake b/kde-modules/KDEInstallDirs.cmake --- a/kde-modules/KDEInstallDirs.cmake +++ b/kde-modules/KDEInstallDirs.cmake @@ -289,6 +289,8 @@ MANDIR DOCDIR) +set(_gnu_install_special_vars LOCALSTATEDIR SYSCONFDIR RUNSTATEDIR) + # Macro for variables that are relative to another variable. We store an empty # value in the cache (for documentation/GUI cache editor purposes), and store # the default value in a local variable. If the cache variable is ever set to @@ -365,12 +367,24 @@ if(_cmakename_is_deprecated AND NOT CMAKE_VERSION VERSION_LESS 3.0.0) message(DEPRECATION "${_cmakename} is deprecated, use KDE_INSTALL_${varname} instead.") endif() - # The CMAKE_ name was given (probably on the command line): move + # The CMAKE_ name was given (probably by GNUInstallDirs or on the command line): move # it to the new name - set(KDE_INSTALL_${varname} "${${_cmakename}}" - CACHE PATH - "${docstring} (${_docpath})" - FORCE) + # + # In special cases defined by GNU Coding Standards and Filesystem Hierarchy Standard, + # paths in CMAKE_INSTALL_xDIR shouldn't be resolved as relative to CMAKE_INSTALL_PREFIX. + # Reuse here resolving logic from GNUInstallDirs. + list(FIND _gnu_install_special_vars "${varname}" _vars_list_offset) + if (CMAKE_INSTALL_FULL_${varname} AND (CMAKE_INSTALL_PREFIX STREQUAL "/usr" OR CMAKE_INSTALL_PREFIX MATCHES "^/opt/.") AND NOT _vars_list_offset EQUAL -1) + set(KDE_INSTALL_${varname} "${CMAKE_INSTALL_FULL_${varname}}" + CACHE PATH + "${docstring} (${_docpath})" + FORCE) + else() + set(KDE_INSTALL_${varname} "${${_cmakename}}" + CACHE PATH + "${docstring} (${_docpath})" + FORCE) + endif() else() # insert an empty value into the cache, indicating the default # should be used (including compatibility vars above) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -135,6 +135,62 @@ add_test_variant(KDEInstallDirsTest.vars_in_sync_cmake_arg KDEInstallDirsTest.vars_in_sync dummy) +set(KDEInstallDirsTest.vars_in_sync_cmake_arg_gnu_usr_EXTRA_OPTIONS + --build-options -DCMAKE_INSTALL_PREFIX=/usr + -DCONFDIR_expected_value=/etc/xdg + -DFULL_CONFDIR_expected_value=/etc/xdg + -DLOCALSTATEDIR_expected_value=/var + -DFULL_LOCALSTATEDIR_expected_value=/var + -DINCLUDEDIR_expected_value=include + -DFULL_INCLUDEDIR_expected_value=/usr/include + -Dinclude_gnuinstalldirs=TRUE + -DCMAKE_WARN_DEPRECATED=TRUE + ) +add_test_variant(KDEInstallDirsTest.vars_in_sync_cmake_arg_gnu_usr + KDEInstallDirsTest.vars_in_sync dummy) + +set(KDEInstallDirsTest.vars_in_sync_cmake_arg_gnu_usrlocal_EXTRA_OPTIONS + --build-options -DCMAKE_INSTALL_PREFIX=/usr/local + -DCONFDIR_expected_value=etc/xdg + -DFULL_CONFDIR_expected_value=/usr/local/etc/xdg + -DLOCALSTATEDIR_expected_value=var + -DFULL_LOCALSTATEDIR_expected_value=/usr/local/var + -DINCLUDEDIR_expected_value=include + -DFULL_INCLUDEDIR_expected_value=/usr/local/include + -Dinclude_gnuinstalldirs=TRUE + -DCMAKE_WARN_DEPRECATED=TRUE + ) +add_test_variant(KDEInstallDirsTest.vars_in_sync_cmake_arg_gnu_usrlocal + KDEInstallDirsTest.vars_in_sync dummy) + +set(KDEInstallDirsTest.vars_in_sync_cmake_arg_gnu_optkde_EXTRA_OPTIONS + --build-options -DCMAKE_INSTALL_PREFIX=/opt/kde + -DCONFDIR_expected_value=/etc/opt/kde/xdg + -DFULL_CONFDIR_expected_value=/etc/opt/kde/xdg + -DLOCALSTATEDIR_expected_value=/var/opt/kde + -DFULL_LOCALSTATEDIR_expected_value=/var/opt/kde + -DINCLUDEDIR_expected_value=include + -DFULL_INCLUDEDIR_expected_value=/opt/kde/include + -Dinclude_gnuinstalldirs=TRUE + -DCMAKE_WARN_DEPRECATED=TRUE + ) +add_test_variant(KDEInstallDirsTest.vars_in_sync_cmake_arg_gnu_optkde + KDEInstallDirsTest.vars_in_sync dummy) + +set(KDEInstallDirsTest.vars_in_sync_cmake_arg_gnu_root_EXTRA_OPTIONS + --build-options -DCMAKE_INSTALL_PREFIX=/ + -DCONFDIR_expected_value=etc/xdg + -DFULL_CONFDIR_expected_value=//etc/xdg + -DLOCALSTATEDIR_expected_value=var + -DFULL_LOCALSTATEDIR_expected_value=//var + -DINCLUDEDIR_expected_value=usr/include + -DFULL_INCLUDEDIR_expected_value=//usr/include + -Dinclude_gnuinstalldirs=TRUE + -DCMAKE_WARN_DEPRECATED=TRUE + ) +add_test_variant(KDEInstallDirsTest.vars_in_sync_cmake_arg_gnu_root + KDEInstallDirsTest.vars_in_sync dummy) + set(KDEInstallDirsTest.vars_in_sync_oldstyle_arg_EXTRA_OPTIONS --build-options -DBIN_INSTALL_DIR=altbin -DBINDIR_expected_value=altbin diff --git a/tests/KDEInstallDirsTest/vars_in_sync/CMakeLists.txt b/tests/KDEInstallDirsTest/vars_in_sync/CMakeLists.txt --- a/tests/KDEInstallDirsTest/vars_in_sync/CMakeLists.txt +++ b/tests/KDEInstallDirsTest/vars_in_sync/CMakeLists.txt @@ -4,6 +4,9 @@ set(ECM_KDE_MODULE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../kde-modules) set(ECM_MODULE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../modules) set(CMAKE_MODULE_PATH "${ECM_KDE_MODULE_DIR}") +if (include_gnuinstalldirs) + include(GNUInstallDirs) +endif() include(KDEInstallDirs) include(../var_list.cmake) @@ -15,6 +18,9 @@ assert_vars_strequal(KDE_INSTALL_${suffix} ${suffix}_expected_value) endif() assert_var_defined(KDE_INSTALL_FULL_${suffix}) + if(DEFINED FULL_${suffix}_expected_value) + assert_vars_strequal(KDE_INSTALL_FULL_${suffix} FULL_${suffix}_expected_value) + endif() if(should_set_CMAKE_INSTALL_${suffix}) assert_vars_strequal(CMAKE_INSTALL_${suffix} KDE_INSTALL_${suffix})