cmake configure_package_config_file指令详解

在 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) 命令的使用,帮助用户方便地集成和使用已安装的库。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的`CMakeLists.txt`中`configure_package_config_file()`函数的使用例子: ```cmake # 设置安装目录 set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries") set(INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for headers") # 配置文件模板 configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/MyProjectConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/MyProjectConfig.cmake" INSTALL_DESTINATION ${INSTALL_LIB_DIR}/cmake/MyProject ) # 安装目标 install( FILES "${CMAKE_CURRENT_BINARY_DIR}/MyProjectConfig.cmake" DESTINATION ${INSTALL_LIB_DIR}/cmake/MyProject ) # 安装头文件和库文件 install( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ${INSTALL_INCLUDE_DIR} ) install( TARGETS myproject EXPORT MyProjectTargets DESTINATION ${INSTALL_LIB_DIR} ) ``` 这个例子中,我们首先定义了安装目录的路径,然后使用`configure_package_config_file()`函数生成了一个`MyProjectConfig.cmake`文件,并将这个文件安装到指定的目录下。这个函数需要传入两个参数,第一个参数是配置文件模板的路径,第二个参数是生成的配置文件的路径,其中模板文件中可以使用`@PACKAGE_NAME@`、`@PACKAGE_VERSION@`等变量,这些变量会被自动替换为实际的值。我们还通过`INSTALL_DESTINATION`参数指定了生成的配置文件的安装目录。 最后,我们使用`install()`函数将目标文件安装到指定的目录下。这个例子中,我们将生成的`MyProjectConfig.cmake`文件安装到`${INSTALL_LIB_DIR}/cmake/MyProject`目录下,将头文件安装到`${INSTALL_INCLUDE_DIR}`目录下,将库文件安装到`${INSTALL_LIB_DIR}`目录下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值