1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
From: =?utf-8?q?Timo_R=C3=B6hling?= <roehling@debian.org>
Date: Thu, 2 Sep 2021 13:06:35 +0200
Subject: use Multi-Arch dirs when installing into /usr
use GNUInstallDirs
use lib for libexec
use share for pkg-config if no library is installed
---
cmake/all.cmake | 12 ++++++++++++
cmake/catkin_package.cmake | 35 +++++++++++++++++++++++++++++------
cmake/em/pkg.pc.em | 2 +-
cmake/templates/pkg.context.pc.in | 1 +
4 files changed, 43 insertions(+), 7 deletions(-)
diff --git a/cmake/all.cmake b/cmake/all.cmake
index 7768f96..3f10e0d 100644
--- a/cmake/all.cmake
+++ b/cmake/all.cmake
@@ -174,6 +174,17 @@ unset(_CATKIN_CURRENT_PACKAGE)
configure_shared_library_build_settings()
# set global install destinations
+# use multiarch when building with debhelper
+if(CMAKE_INSTALL_PREFIX STREQUAL "/usr")
+include(GNUInstallDirs)
+set(CATKIN_GLOBAL_BIN_DESTINATION "${CMAKE_INSTALL_BINDIR}")
+set(CATKIN_GLOBAL_ETC_DESTINATION "${CMAKE_INSTALL_SYSCONFDIR}")
+set(CATKIN_GLOBAL_INCLUDE_DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
+set(CATKIN_GLOBAL_LIB_DESTINATION "${CMAKE_INSTALL_LIBDIR}")
+set(CATKIN_GLOBAL_LIBEXEC_DESTINATION lib)
+set(CATKIN_GLOBAL_PYTHON_DESTINATION ${PYTHON_INSTALL_DIR})
+set(CATKIN_GLOBAL_SHARE_DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}")
+else()
set(CATKIN_GLOBAL_BIN_DESTINATION bin)
set(CATKIN_GLOBAL_ETC_DESTINATION etc)
set(CATKIN_GLOBAL_INCLUDE_DESTINATION include)
@@ -181,6 +192,7 @@ set(CATKIN_GLOBAL_LIB_DESTINATION lib)
set(CATKIN_GLOBAL_LIBEXEC_DESTINATION lib)
set(CATKIN_GLOBAL_PYTHON_DESTINATION ${PYTHON_INSTALL_DIR})
set(CATKIN_GLOBAL_SHARE_DESTINATION share)
+endif()
# undefine CATKIN_ENV since it might be set in the cache from a previous build
set(CATKIN_ENV "" CACHE INTERNAL "catkin environment" FORCE)
diff --git a/cmake/catkin_package.cmake b/cmake/catkin_package.cmake
index df36e23..2b0cd8f 100644
--- a/cmake/catkin_package.cmake
+++ b/cmake/catkin_package.cmake
@@ -314,7 +314,7 @@ function(_catkin_package)
# prepend library path of this workspace
set(PKG_CONFIG_LIB_PATHS ${lib_paths})
- list(INSERT PKG_CONFIG_LIB_PATHS 0 ${PROJECT_SPACE_DIR}/lib)
+ list(INSERT PKG_CONFIG_LIB_PATHS 0 ${PROJECT_SPACE_DIR}/${CATKIN_GLOBAL_LIB_DESTINATION})
set(PKG_CMAKE_DIR ${PROJECT_SPACE_DIR}/share/${PROJECT_NAME}/cmake)
if("${PROJECT_NAME}" STREQUAL "catkin")
set(PKG_CMAKE_DIR "${catkin_EXTRAS_DIR}")
@@ -433,9 +433,32 @@ function(_catkin_package)
list_append_unique(PROJECT_PKG_CONFIG_INCLUDE_DIRS ${PROJECT_DEPENDENCIES_INCLUDE_DIRS})
endif()
+ # ROS default locations for .pc and .cmake files
+ set(DEBIAN_PKG_CONFIG_DIR lib/pkgconfig)
+ set(DEBIAN_CMAKE_DIR share/${PROJECT_NAME}/cmake)
+ if(CMAKE_INSTALL_PREFIX STREQUAL "/usr")
+ # Special treatment for /usr installation:
+ # - if the package is arch-independent, put .pc and .cmake files into share/
+ # - otherwise, put .pc and .cmake files into lib/<triplet>
+ set(DEBIAN_PKG_CONFIG_DIR share/pkgconfig)
+ # We treat packages as arch-dependent if they explicitly refer to the arch triplet
+ # or export shared objects.
+ if(CMAKE_LIBRARY_ARCHITECTURE AND
+ (PROJECT_PKG_CONFIG_INCLUDE_DIRS MATCHES "${CMAKE_LIBRARY_ARCHITECTURE}" OR PKG_CONFIG_LIBRARIES))
+ set(DEBIAN_PKG_CONFIG_DIR ${CATKIN_GLOBAL_LIB_DESTINATION}/pkgconfig)
+ set(DEBIAN_CMAKE_DIR ${CATKIN_GLOBAL_LIB_DESTINATION}/cmake/${PROJECT_NAME})
+ endif()
+ endif()
+
# prepend library path of this workspace
- set(PKG_CONFIG_LIB_PATHS ${lib_paths})
- list(INSERT PKG_CONFIG_LIB_PATHS 0 ${PROJECT_SPACE_DIR}/lib)
+ if(PKG_CONFIG_LIBRARIES)
+ set(PKG_CONFIG_LIB_PATHS ${lib_paths})
+ list(INSERT PKG_CONFIG_LIB_PATHS 0 ${PROJECT_SPACE_DIR}/${CATKIN_GLOBAL_LIB_DESTINATION})
+ else()
+ # If no libraries are shipped, clear the (useless) library search paths
+ # to prevent /usr/lib/<triplet> from leaking into CMake configs
+ set(PKG_CONFIG_LIB_PATHS)
+ endif()
# package cmake dir is the folder where the generated pkgConfig.cmake is located
set(PKG_CMAKE_DIR "\${${PROJECT_NAME}_DIR}")
@@ -448,7 +471,7 @@ function(_catkin_package)
${catkin_EXTRAS_DIR}/em/pkg.pc.em
${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/installspace/${PROJECT_NAME}.pc)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/installspace/${PROJECT_NAME}.pc
- DESTINATION lib/pkgconfig
+ DESTINATION ${DEBIAN_PKG_CONFIG_DIR}
)
endif()
@@ -495,7 +518,7 @@ function(_catkin_package)
endforeach()
install(FILES
${installable_cfg_extras}
- DESTINATION share/${PROJECT_NAME}/cmake
+ DESTINATION ${DEBIAN_CMAKE_DIR}
)
if(NOT PROJECT_SKIP_CMAKE_CONFIG_GENERATION)
@@ -521,7 +544,7 @@ function(_catkin_package)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/installspace/${PROJECT_NAME}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/catkin_generated/installspace/${PROJECT_NAME}Config-version.cmake
- DESTINATION share/${PROJECT_NAME}/cmake
+ DESTINATION ${DEBIAN_CMAKE_DIR}
)
endif()
diff --git a/cmake/em/pkg.pc.em b/cmake/em/pkg.pc.em
index 549fb75..9355229 100644
--- a/cmake/em/pkg.pc.em
+++ b/cmake/em/pkg.pc.em
@@ -4,5 +4,5 @@ Name: @(CATKIN_PACKAGE_PREFIX + PROJECT_NAME)
Description: Description of @PROJECT_NAME
Version: @PROJECT_VERSION
Cflags: @(' '.join(['-I%s' % include for include in PROJECT_PKG_CONFIG_INCLUDE_DIRS]))
-Libs: -L${prefix}/lib @(' '.join(PKG_CONFIG_LIBRARIES_WITH_PREFIX))
+Libs: @('-L${prefix}/'+PROJECT_LIB_DIR+' ' if PKG_CONFIG_LIBRARIES_WITH_PREFIX else '')@(' '.join(PKG_CONFIG_LIBRARIES_WITH_PREFIX))
Requires: @(PROJECT_CATKIN_DEPENDS)
diff --git a/cmake/templates/pkg.context.pc.in b/cmake/templates/pkg.context.pc.in
index 8e9cd6b..0329bf0 100644
--- a/cmake/templates/pkg.context.pc.in
+++ b/cmake/templates/pkg.context.pc.in
@@ -6,3 +6,4 @@ PKG_CONFIG_LIBRARIES_WITH_PREFIX = "@PKG_CONFIG_LIBRARIES_WITH_PREFIX@".split(';
PROJECT_NAME = "@PROJECT_NAME@"
PROJECT_SPACE_DIR = "@PROJECT_SPACE_DIR@"
PROJECT_VERSION = "@PROJECT_VERSION@"
+PROJECT_LIB_DIR = "@CATKIN_GLOBAL_LIB_DESTINATION@"
|