在 CMake 中,configure_package_config_file 命令用于生成包配置文件(Package Configuration File),这些文件用于指定如何使用和链接某个库或工具。通常情况下,这些文件用于支持 CMake 的 find_package 命令来查找和加载已安装的软件包。
使用方法
configure_package_config_file(
"input_file"
"output_file"
[INSTALL_DESTINATION <dir>]
[PATH_VARS var1 var2 ...]
[NO_CHECK_REQUIRED_COMPONENTS]
[NO_SET_AND_CHECK_MACRO]
[GENERATE_DEFAULT_CONFIG_YES]
[GENERATE_DEFAULT_CONFIG_NO]
[INSTALL_PREFIX <prefix>]
[NAMESPACE <namespace>]
[INCLUDE_DIRS_VAR <include-var>]
[DEPENDENCIES <deps>]
)
参数解释
- “input_file”:输入的模板配置文件。通常是一个 .in 文件,其中包含变量和 CMake 的配置命令。
- “output_file”:生成的包配置文件的输出路径。
- INSTALL_DESTINATION dir:指定安装的目标路径。
- PATH_VARS var1 var2 …:指定需要在包配置文件中展开为绝对路径的变量列表。
- NO_CHECK_REQUIRED_COMPONENTS:禁用对所需组件的检查。
- NO_SET_AND_CHECK_MACRO:禁用设置和检查宏。
- GENERATE_DEFAULT_CONFIG_YES:生成默认的配置选项为 YES。
- GENERATE_DEFAULT_CONFIG_NO:生成默认的配置选项为 NO。
- INSTALL_PREFIX :指定安装前缀。
- NAMESPACE :设置 CMake 的命名空间。
- INCLUDE_DIRS_VAR :包含目录变量。
- DEPENDENCIES :依赖项。
示例
假设有一个库名为 MyLib,其安装目录结构如下:
install/
├── include/
│ └── mylib/
│ └── mylib.h
├── lib/
│ ├── libmylib.a
│ └── libmylib.so
└── cmake/
└── MyLibConfig.cmake.in
在 MyLibConfig.cmake.in 文件中,可能包含类似以下内容的配置模板:
@PACKAGE_INIT@
# Set the include directory for MyLib
set(MyLib_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")
# Set the library directory for MyLib
set(MyLib_LIBRARIES "${CMAKE_INSTALL_PREFIX}/lib/libmylib.a")
# Provide the version of MyLib
set(MyLib_VERSION "${PACKAGE_VERSION}")
# Export the targets from the build tree
export(TARGETS MyLib FILE "${CMAKE_CURRENT_BINARY_DIR}/MyLibTargets.cmake")
# Configure MyLibConfigVersion.cmake
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake"
VERSION ${PACKAGE_VERSION}
COMPATIBILITY SameMajorVersion
)
# Install MyLibConfig.cmake and MyLibConfigVersion.cmake
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake"
DESTINATION "${CMAKE_INSTALL_PREFIX}/cmake"
)
在顶层的 CMakeLists.txt 文件中,通过 configure_package_config_file 命令生成 MyLibConfig.cmake 文件:
include(CMakePackageConfigHelpers)
set(PACKAGE_VERSION 1.0.0)
set(INSTALL_CMAKE_DIR "cmake" CACHE PATH "Installation directory for CMake files")
configure_package_config_file(
MyLibConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake
INSTALL_DESTINATION ${INSTALL_CMAKE_DIR}
PATH_VARS CMAKE_INSTALL_PREFIX
)
install(
FILES
${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake
DESTINATION
${INSTALL_CMAKE_DIR}
)
在这个示例中,configure_package_config_file 命令会根据 MyLibConfig.cmake.in 文件生成实际的 MyLibConfig.cmake 文件,将路径变量 ${CMAKE_INSTALL_PREFIX} 替换为实际的安装路径,然后安装到指定的路径中。
通过这种方式,生成的包配置文件可以支持 find_package(MyLib) 命令的使用,帮助用户方便地集成和使用已安装的库。