CMake:将包含目录传递给外部项目

8

我正在使用 cmakeexternal project 模块,通过 ExternalProject_Add

我想为外部项目指定自定义头文件位置(就像在该项目中使用 include_directories 一样),但我无法修改其 CMakeLists.txt 并且不想应用补丁。

有没有可能向我的外部项目传递一些包含路径?

我尝试了 CMAKE_ARGS -DCMAKE_INCLUDE_PATH=<required path>,但没有成功。


你想添加的目录中有什么类型的头文件?如果它们与某个第三方库相关,则外部项目可能会使用 find_package() 查找头文件,因此您需要设置影响此函数的 CMake 变量。或者您的情况不同吗? - Tsyvarev
@Tsyvarev:我的情况有所不同。外部项目只是在某些自定义位置包含头文件。对于主项目,例如,我可以使用include_directories()指向此位置,但对于外部项目,我无法访问CMakeLists.txt,并且我想在我的顶级cmake中为该项目设置环境。我已经发现CMAKE_INCLUDE_PATH绝对不是我要找的东西。 - avtomaton
1
所以你需要解决一个糟糕编写的外部项目的问题。“对于主要项目,例如,我可以使用include_directories()指向此位置” - 你可以包装外部项目,就好像它是在子目录中编译的,并且在顶层(方便书写的)CMakeLists.txt中发出了include_directories()。其他可能性是通过额外的-I选项传递CMAKE_CXX_FLAGS,甚至重新定义已经具有此选项的编译器。 - Tsyvarev
我需要解决糟糕的操作系统和软件包管理器的问题 :) 令人惊讶的是,并不是每个项目都提供 Find<package>.cmake<package>Config.cmake 或者甚至是 CMakeLists.txt,但是提供了头文件和库。我所需要做的就是指定位置,在那里我可以拥有头文件。就像在我的自己的 CMakeLists.txt 中使用 include_directories 一样。是的,我已经找到了使用 CMAKE_CXX_FLAGS 的解决方案,但它看起来像一个技巧,并且并不完全可移植。封装似乎更加糟糕。但感谢您的评论。我只是好奇为什么在如此强大的构建系统中缺少如此简单的东西。 - avtomaton
发现变量 CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE文档链接)。根据其描述,它允许将代码注入到外部项目构建中。看起来这正是您要查找的内容。 - Tsyvarev
谢谢您提供有趣的链接,但它只能用于将一些 cmake 代码包含到主项目中,与构建环境无关。 - avtomaton
2个回答

10

您可以通过将此脚本的路径分配给变量CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE文档)来执行外部项目的其他CMake脚本。

外部项目使用CMake命令。

project(e_cool)

而且你想执行

include_directories(/path/to/additional/include)

就在那时。

要做到这一点,您需要准备带有相应内容的cmake脚本:

fix_e_cool.cmake:

include_directories(/path/to/additional/include)

请通过主项目中的CMAKE_ARGS选项将此脚本传递给ExternalProject_Add

CMakeLists.txt:

...
ExternalProject_Add(<name>
    ...
    CMAKE_ARGS -DCMAKE_PROJECT_e_cool_INCLUDE=${CMAKE_SOURCE_DIR}/fix_e_cool.cmake
)

-2
使用option可以让你从命令行传递数据,例如:
cmake -DHEADER_PATH="/usr/my/path/file.h" ..

你误解了我的意思。我想通过ExternalProject_Add命令将选项传递给外部项目,并且我想确定哪个变量负责包含路径。我确实知道我可以通过命令行向当前项目传递参数。 - avtomaton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接