From 6b9318d6375ca75287f02988b3b461dc3d8f2515 Mon Sep 17 00:00:00 2001 From: Ben Wolsieffer Date: Sun, 5 Jul 2020 18:16:38 -0400 Subject: [PATCH] Fix assumptions that CMAKE_INSTALL_*DIR paths are relative. When an absolute path is desired, the CMAKE_INSTALL_FULL_*DIR variables should be used instead of concatenating with CMAKE_INSTALL_PREFIX. Special handling is also needed for pkg-config and CMake config files to retain relative paths if the lib/include directories are subdirectories of the install prefix. --- CMakeLists.txt | 16 +++++++++++++--- cmake/pkgconfig/urdfdom.pc.in | 4 ++-- cmake/urdfdom-config.cmake.in | 6 +++--- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b5330130..a1097264 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,7 @@ option(APPEND_PROJECT_NAME_TO_INCLUDEDIR if(APPEND_PROJECT_NAME_TO_INCLUDEDIR) set(CMAKE_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}") + set(CMAKE_INSTALL_FULL_INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}/${PROJECT_NAME}") endif() # set the default build type @@ -59,9 +60,9 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}" enable_testing() -set(CMAKE_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake) -string(REGEX REPLACE "[^/]+" ".." RELATIVE_PATH_CMAKE_DIR_TO_PREFIX "${CMAKE_CONFIG_INSTALL_DIR}") -string(REGEX REPLACE "[^/]+" ".." RELATIVE_PATH_LIBDIR_TO_PREFIX "${CMAKE_INSTALL_LIBDIR}") +set(CMAKE_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/${PROJECT_NAME}/cmake) +file(RELATIVE_PATH RELATIVE_PATH_CMAKE_DIR_TO_PREFIX "${CMAKE_CONFIG_INSTALL_DIR}" "${CMAKE_INSTALL_PREFIX}") +file(RELATIVE_PATH RELATIVE_PATH_LIBDIR_TO_PREFIX "${CMAKE_INSTALL_FULL_LIBDIR}" "${CMAKE_INSTALL_PREFIX}") add_subdirectory(urdf_parser) @@ -69,6 +70,12 @@ set(PKG_NAME ${PROJECT_NAME}) set(PKG_LIBRARIES urdfdom_sensor urdfdom_model_state urdfdom_model urdfdom_world) set(PKG_DEPENDS urdfdom_headers) set(PKG_EXPORTS urdfdom) +string(REPLACE + "${CMAKE_INSTALL_PREFIX}" "\${${PROJECT_NAME}_DIR}/${RELATIVE_PATH_CMAKE_DIR_TO_PREFIX}" + CMAKE_CONF_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}") +string(REPLACE + "${CMAKE_INSTALL_PREFIX}" "\${${PROJECT_NAME}_DIR}/${RELATIVE_PATH_CMAKE_DIR_TO_PREFIX}" + CMAKE_CONF_INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}") set(cmake_conf_file "cmake/urdfdom-config") include(CMakePackageConfigHelpers) write_basic_package_version_file( @@ -92,7 +99,10 @@ install(FILES package.xml DESTINATION share/${PROJECT_NAME}) set(PKG_DESC "Unified Robot Description Format") set(PKG_DEPENDS "urdfdom_headers") # make the list separated by spaces instead of ; set(PKG_URDF_LIBS "-lurdfdom_sensor -lurdfdom_model_state -lurdfdom_model -lurdfdom_world") +string(REPLACE "${CMAKE_INSTALL_PREFIX}" "\${prefix}" PKG_CONF_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}") +string(REPLACE "${CMAKE_INSTALL_PREFIX}" "\${prefix}" PKG_CONF_INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}") set(pkg_conf_file "cmake/pkgconfig/urdfdom.pc") + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${pkg_conf_file}.in" "${CMAKE_BINARY_DIR}/${pkg_conf_file}" @ONLY) install(FILES ${CMAKE_BINARY_DIR}/${pkg_conf_file} DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig/ COMPONENT pkgconfig) diff --git a/cmake/pkgconfig/urdfdom.pc.in b/cmake/pkgconfig/urdfdom.pc.in index 77d1d9f9..01ccb892 100644 --- a/cmake/pkgconfig/urdfdom.pc.in +++ b/cmake/pkgconfig/urdfdom.pc.in @@ -1,8 +1,8 @@ # This file was generated by CMake for @PROJECT_NAME@ prefix=${pcfiledir}/../@RELATIVE_PATH_LIBDIR_TO_PREFIX@ exec_prefix=${prefix} -libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ -includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ +libdir=@PKG_CONF_LIBDIR@ +includedir=@PKG_CONF_INCLUDEDIR@ Name: @PKG_NAME@ Description: @PKG_DESC@ diff --git a/cmake/urdfdom-config.cmake.in b/cmake/urdfdom-config.cmake.in index ee84f41d..9a770192 100644 --- a/cmake/urdfdom-config.cmake.in +++ b/cmake/urdfdom-config.cmake.in @@ -8,16 +8,16 @@ set(@PKG_NAME@_CONFIG_INCLUDED TRUE) set(CMAKE_MODULE_PATH_BACKUP_URDFDOM ${CMAKE_MODULE_PATH}) list(APPEND CMAKE_MODULE_PATH "${@PROJECT_NAME@_DIR}") -set(@PKG_NAME@_INCLUDE_DIRS "${@PROJECT_NAME@_DIR}/@RELATIVE_PATH_CMAKE_DIR_TO_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@") +set(@PKG_NAME@_INCLUDE_DIRS "@CMAKE_CONF_INCLUDEDIR@") foreach(lib @PKG_LIBRARIES@) set(onelib "${lib}-NOTFOUND") set(onelibd "${lib}-NOTFOUND") find_library(onelib ${lib} - PATHS "${@PROJECT_NAME@_DIR}/@RELATIVE_PATH_CMAKE_DIR_TO_PREFIX@/@CMAKE_INSTALL_LIBDIR@" + PATHS "@CMAKE_CONF_LIBDIR@" NO_DEFAULT_PATH) find_library(onelibd ${lib}d - PATHS "${@PROJECT_NAME@_DIR}/@RELATIVE_PATH_CMAKE_DIR_TO_PREFIX@/@CMAKE_INSTALL_LIBDIR@" + PATHS "@CMAKE_CONF_LIBDIR@" NO_DEFAULT_PATH) if(onelib-NOTFOUND AND onelibd-NOTFOUND) message(FATAL_ERROR "Library '${lib}' in package @PKG_NAME@ is not installed properly")