首页 > 解决方案 > 如何从包含项目的源代码树中包含 CMake 文件

问题描述

我正在为一个用 C 编写的旧框架建立一个基于 CMake 的构建系统。它由一个二进制文件、一些核心库和许多动态链接库组成,这些库是针对核心库构建的。我的目标是在几个 CMake 项目(“基础框架”、“扩展库”……)中构建这些库,支持两种场景:

(第三种情况是针对基本框架的安装树构建扩展库。不幸的是,这种情况目前被其他 CMake 问题所阻止。)

现在,我想将包含base_framework/cmake/functions.cmake所有库的一些自定义 CMake 函数的文件包含到这两种情况下的所有项目的顶级CMakeLists.txts 中。

对于第二种情况,我只需在以下位置设置一个缓存的 CMake 变量base_framework/CMakeLists.txt

set(BASE_FRAMEWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR}
    CACHE PATH "" FORCE)

并使用此变量来包含函数文件extension_libraries/CMakeLists.txt以及my_project/CMakeLists.txt

include(${BASE_FRAMEWORK_DIR}/cmake/functions.cmake)

但是如何在第一个场景中找到function.cmake基础框架的源代码树中的文件?extenstion_libs/cmake所有目录(base_framework, extension_libs,基本框架的构建树)可能位于我计算机上的任何位置。

标签: cmake

解决方案


为了扩展我对您的第一个场景的评论,您似乎可以设置导出core_libraries目标的一个属性以包含base_framework/cmake模块的路径。所以你可以在base_framework/CMakeLists.txt文件中设置这个,让我们在LABELS目标属性中设置它。然后,我们告诉 CMake 使用以下命令导出LABELS属性EXPORT_PROPERTIES

你的base_framework/CMakeLists.txt文件:

# Define the path to 'base_framework/cmake'
set(BASE_FRAMEWORK_CMAKE_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

add_library(CoreLibrary1 ...)
# Set the LABELS property, and tell CMake to export it.
set_target_properties(CoreLibrary1 PROPERTIES 
    LABELS "${BASE_FRAMEWORK_CMAKE_MODULES}"
    EXPORT_PROPERTIES "LABELS"
)
# Define the export 'foo'.
install(TARGETS CoreLibrary1 EXPORT foo DESTINATION /path/to/install/targets)
export(EXPORT foo FILE FooFrameworkConfig.cmake)

这将确保base_frameworkCMake 模块的路径被显式导出,并且可以在被另一个项目导入时访问:

你的extension_libs/CMakeLists.txt文件:

find_package(FooFramework)
# Get the LABELS property from the imported target.
get_target_property(BASE_FRAMEWORK_MODULE_DIR CoreLibrary1 LABELS)
message(STATUS "BASE_FRAMEWORK_MODULE_DIR: ${BASE_FRAMEWORK_MODULE_DIR}")

通过调试message(),我们可以验证 CMake 模块目录是否已导入:

BASE_FRAMEWORK_MODULE_DIR: /your/path/to/base_framework/cmake

编辑LABELS:您还可以使用define_property()为目标定义自己的自定义属性,而不是劫持目标属性。


推荐阅读