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@"
