Generate pkg-config files at install time

This enables us to generate pkg-config with proper paths if the
installation prefix is decided at install time, e.g. with
```
cmake --install build-dir --prefix /path/to/somewhere
```

It also means that we can use CMake's generator expression to get
the _real_ final name of the libraries, e.g. including debug postfix.

Closes #2979
This commit is contained in:
Martin Hořeňovský 2025-07-10 16:39:42 +02:00
parent 39c32b9662
commit 3839e27f05
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A
3 changed files with 42 additions and 24 deletions

View File

@ -1,10 +1,10 @@
includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
libdir=@CMAKE_INSTALL_FULL_LIBDIR@
prefix=@CMAKE_INSTALL_PREFIX@
libdir=${prefix}/@lib_dir@
pkg_version=@Catch2_VERSION@
Name: Catch2-With-Main
Name: Catch2 with main function
Description: A modern, C++-native test framework for C++14 and above (links in default main)
URL: https://github.com/catchorg/Catch2
Version: ${pkg_version}
Requires: catch2 = ${pkg_version}
Cflags: -I${includedir}
Libs: -L${libdir} -lCatch2Main
Libs: -L${libdir} -l@lib_name@

View File

@ -1,11 +1,11 @@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
libdir=@CMAKE_INSTALL_FULL_LIBDIR@
includedir=${prefix}/@include_dir@
libdir=${prefix}/@lib_dir@
Name: Catch2
Description: A modern, C++-native, test framework for C++14 and above
URL: https://github.com/catchorg/Catch2
Version: @Catch2_VERSION@
Cflags: -I${includedir}
Libs: -L${libdir} -lCatch2
Libs: -L${libdir} -l@lib_name@

View File

@ -170,23 +170,41 @@ if(NOT_SUBPROJECT)
"${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig"
CACHE PATH "Path where catch2.pc is installed"
)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2.pc.in
${CMAKE_CURRENT_BINARY_DIR}/catch2.pc
@ONLY
)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2-with-main.pc.in
${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc
@ONLY
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/catch2.pc"
"${CMAKE_CURRENT_BINARY_DIR}/catch2-with-main.pc"
DESTINATION
${PKGCONFIG_INSTALL_DIR}
# Generate the pkg-config files
# To understand the script below, you have to understand that it works in two steps.
# 1) A CMake script is generated at configuration time
# 2) It is executed at install time.
# And both of these have access to different parts of the information we need.
#
# Further, the variables before "[[" are expanded at configuration time,
# while the ones inside the [[]] block are expanded at script execution (install) time.
string(
JOIN "\n"
install_script
"set(install_pkgconfdir \"${PKGCONFIG_INSTALL_DIR}\")"
"set(impl_pc_file \"${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2.pc.in\")"
"set(main_pc_file \"${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2-with-main.pc.in\")"
"set(Catch2_VERSION ${Catch2_VERSION})"
"set(include_dir \"${CMAKE_INSTALL_INCLUDEDIR}\")"
"set(lib_dir \"${CMAKE_INSTALL_LIBDIR}\")"
[[
set(lib_name "$<TARGET_FILE_BASE_NAME:Catch2>")
configure_file(
"${impl_pc_file}"
"${CMAKE_INSTALL_PREFIX}/${install_pkgconfdir}/catch2.pc"
@ONLY
)
set(lib_name "$<TARGET_FILE_BASE_NAME:Catch2WithMain>")
configure_file(
"${main_pc_file}"
"${CMAKE_INSTALL_PREFIX}/${install_pkgconfdir}/catch2-with-main.pc"
@ONLY
)
]]
)
install(CODE "${install_script}")
set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/")