From ab5164ab2e98297264e8d3de85d0a9b5c78b8b69 Mon Sep 17 00:00:00 2001 From: tandede <1090179959@qq.com> Date: Mon, 24 Aug 2026 14:37:38 +0800 Subject: [PATCH] [cmake] Make pkg-config files relocatable --- cmake/pcl_targets.cmake | 9 +++++++++ cmake/pkgconfig-headeronly.cmake.in | 2 +- cmake/pkgconfig.cmake.in | 2 +- test/CMakeLists.txt | 7 +++++++ test/cmake/test_pkgconfig_prefix.cmake | 23 +++++++++++++++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 test/cmake/test_pkgconfig_prefix.cmake diff --git a/cmake/pcl_targets.cmake b/cmake/pcl_targets.cmake index 32281f20700..6aca8c98c4b 100644 --- a/cmake/pcl_targets.cmake +++ b/cmake/pcl_targets.cmake @@ -585,6 +585,15 @@ function(PCL_MAKE_PKGCONFIG _name) string(APPEND PKG_INTERNAL_DEPS " -l${_dep}") endforeach() + if(IS_ABSOLUTE "${PKGCFG_INSTALL_DIR}") + set(PKGCONFIG_PREFIX "${CMAKE_INSTALL_PREFIX}") + else() + file(RELATIVE_PATH _pkgconfig_to_prefix + "${CMAKE_INSTALL_PREFIX}/${PKGCFG_INSTALL_DIR}" + "${CMAKE_INSTALL_PREFIX}") + set(PKGCONFIG_PREFIX "\${pcfiledir}/${_pkgconfig_to_prefix}") + endif() + set(_pc_file ${CMAKE_CURRENT_BINARY_DIR}/${_name}.pc) if(ARGS_HEADER_ONLY) configure_file(${PROJECT_SOURCE_DIR}/cmake/pkgconfig-headeronly.cmake.in ${_pc_file} @ONLY) diff --git a/cmake/pkgconfig-headeronly.cmake.in b/cmake/pkgconfig-headeronly.cmake.in index 9cf9b9d81e9..00f10043cc5 100644 --- a/cmake/pkgconfig-headeronly.cmake.in +++ b/cmake/pkgconfig-headeronly.cmake.in @@ -1,5 +1,5 @@ # This file was generated by CMake for @PROJECT_NAME@ library @PKG_NAME@ -prefix=@CMAKE_INSTALL_PREFIX@ +prefix=@PKGCONFIG_PREFIX@ exec_prefix=${prefix} libdir=${prefix}/@LIB_INSTALL_DIR@ #includedir=${prefix}/@INCLUDE_INSTALL_DIR@ diff --git a/cmake/pkgconfig.cmake.in b/cmake/pkgconfig.cmake.in index c351e441a15..edfabf49fe6 100644 --- a/cmake/pkgconfig.cmake.in +++ b/cmake/pkgconfig.cmake.in @@ -1,5 +1,5 @@ # This file was generated by CMake for @PROJECT_NAME@ library @PKG_NAME@ -prefix=@CMAKE_INSTALL_PREFIX@ +prefix=@PKGCONFIG_PREFIX@ exec_prefix=${prefix} libdir=${prefix}/@LIB_INSTALL_DIR@ #includedir=${prefix}/@INCLUDE_INSTALL_DIR@ diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 07bc787ddf6..53c9fc93822 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -16,6 +16,13 @@ target_include_directories(pcl_gtest PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) enable_testing() +add_test(NAME pcl_pkgconfig_prefix + COMMAND ${CMAKE_COMMAND} + "-DPCL_BINARY_DIR=${PCL_BINARY_DIR}" + "-DPKGCFG_INSTALL_DIR=${PKGCFG_INSTALL_DIR}" + "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}" + -P "${PCL_SOURCE_DIR}/test/cmake/test_pkgconfig_prefix.cmake") + # VS needs -C config to run correct if(MSVC) set(PCL_CTEST_ARGUMENTS ${PCL_CTEST_ARGUMENTS} -C $<$:Debug>$<$:Release>) diff --git a/test/cmake/test_pkgconfig_prefix.cmake b/test/cmake/test_pkgconfig_prefix.cmake new file mode 100644 index 00000000000..0d30937652b --- /dev/null +++ b/test/cmake/test_pkgconfig_prefix.cmake @@ -0,0 +1,23 @@ +if(IS_ABSOLUTE "${PKGCFG_INSTALL_DIR}") + set(expected_prefix "prefix=${CMAKE_INSTALL_PREFIX}") +else() + file(RELATIVE_PATH pkgconfig_to_prefix + "${CMAKE_INSTALL_PREFIX}/${PKGCFG_INSTALL_DIR}" + "${CMAKE_INSTALL_PREFIX}") + set(expected_prefix "prefix=\${pcfiledir}/${pkgconfig_to_prefix}") +endif() + +file(GLOB_RECURSE pkgconfig_files "${PCL_BINARY_DIR}/pcl_*.pc") +if(NOT pkgconfig_files) + message(FATAL_ERROR "No generated PCL pkg-config files found") +endif() + +foreach(pkgconfig_file IN LISTS pkgconfig_files) + file(STRINGS "${pkgconfig_file}" prefix_line REGEX "^prefix=") + if(NOT prefix_line STREQUAL expected_prefix) + message(FATAL_ERROR + "Unexpected prefix in ${pkgconfig_file}:\n" + " expected: ${expected_prefix}\n" + " actual: ${prefix_line}") + endif() +endforeach()