CMakeLists.txt 的安装功能中.cmake 文件的用途是什么?

What is the use of .cmake files in install function of CMakeLists.txt?

CMakeLists.txt

...
add_library( ${PROJECT_NAME} SHARED src/run_pipeline.cpp )

target_link_libraries( ${PROJECT_NAME} )
install( TARGETS ${PROJECT_NAME} DESTINATION lib )
install( FILES ${PROJECT_NAME}Config.cmake DESTINATION lib/cmake/${PROJECT_NAME} )

那个 ${PROJECT_NAME}Config.cmake 文件是:

add_library( pipeline_controller STATIC IMPORTED)

find_library( PIPELINE_CONTROLLER_LIBRARY_PATH pipeline_controller HINTS "${CMAKE_CURRENT_LIST_DIR}/install/lib/")

set_target_properties( pipeline_controller PROPERTIES IMPORTED_LOCATION "${PIPELINE_CONTROLLER_LIBRARY_PATH}")

在哪些情况下我们需要单独的 .cmake 文件? .cmake 提供了什么 CMakeLists.txt 没有提供?为什么用在上面的案例中?

<name>Config.cmake<lower-case-name>-config.cmake 文件被 find_package 用于查找库及其元信息。

当有人想在他们的应用程序或库中 link pipeline_controller 库时,可以使用 find_package(pipeline_controller) 来完成。在内部 find_package 搜索并使用 pipeline_controllerConfig.cmakepipeline_controller-config.cmake

您可能会发现介绍性描述 here 很有帮助。

<Package>Config.cmake 个文件是 package configuration 个文件。它们对于提供有关已安装包的最小信息集很有用,因此包的 消费者 可以轻松地在他们的 CMake 项目中使用它。作为基于 CMake 的项目的包维护者,我们非常鼓励(并且坦率地说,期望)提供这样的文件,因为这是其他人将您的库集成到他们的项目中的最有效方式。

您的软件包的使用者通常会使用 find_package 来查找已安装的软件包:

find_package(SomePackage REQUIRED)

find_package Config Mode 的搜索过程将查找以下包配置文件之一以将 SomePackage 拉入 CMake 项目:

  • SomePackageConfig.cmake
  • somepackage-config.cmake

通过提供这些文件之一(如 install 命令支持),您可以让其他人在他们自己的 CMake 项目中轻松使用您的包。

Craig Scott 是 CMake 的共同维护者,在 CppCon 2019 上进行了深入的介绍,提供了有关该主题的大量信息。