将文件夹下的所有文件添加到 CMake glob?

Posted

技术标签:

【中文标题】将文件夹下的所有文件添加到 CMake glob?【英文标题】:Add all files under a folder to a CMake glob? 【发布时间】:2016-05-26 11:43:22 【问题描述】:

我刚刚读到这个:

CMake - Automatically add all files in a folder to a target?

答案建议使用文件 glob,例如:

file(GLOB "*.h" "*.cpp")

现在,如果我希望我的目标依赖于某个文件夹下某种类型的所有文件——可能位于多个子文件夹中,该怎么办?我尝试使用

execute_process(COMMAND find src/baz/ -name "*.cpp" OUTPUT_VARIABLE BAR)

然后

add_executable(foo $BAR

但这给了我错误:

找不到源文件:

  src/baz/some/file/here

src/baz/some/other_file/here

src/baz/some/other_file/here2

(是的,有那个间距。)

我在这里做错了什么?

【问题讨论】:

可能是file(GLOB_RECURSE ...)?但请注意Why is cmake file GLOB evil? 和Best way to specify sourcefiles in CMake 以这种方式使用find 是个坏主意,但您可以通过添加-type f 来解决您似乎遇到的问题。 @einpoklum 基于 globing 的构建的故障模式可能难以诊断,甚至可能是静默、损坏的构建,这可能是由于与实际代码无关的问题而发生的源代码控制系统。基于显式文件列表的构建的失败模式是显式且可重现的失败,它可以由源代码控制系统中的实际代码控制/防止,无论开发人员检查代码可能会在他的工作目录中留下任何其他垃圾。 @einpoklum 哦,我对以这种方式使用find 的评论也不是关于通常的全局问题。我建议不要在这里使用find 的原因是因为它无缘无故地添加了额外的依赖项。 file(GLOB_RECURSE ...) 在这里似乎是正确的。 CMake 的作者不建议在项目中使用,只能在脚本中使用。 presentation 【参考方案1】:

把我的评论变成答案

如果你想为文件添加递归搜索,请使用file(GLOB_RECURSE ...)

file(GLOB_RECURSE source_list "*.cpp" "*.hpp")

您的第二个示例将转换为

file(GLOB_RECURSE BAR "src/baz/*.cpp")

参考文献

file(...) Specify source files globally with GLOB?

【讨论】:

这里可能会很好添加,也可以使用内置的CMake变量来指示我们希望递归添加的文件的确切位置,即-file(GLOB_RECURSE SRC" $CMAKE_CURRENT_LIST_DIR/src/*.cpp") - 将添加位于 src 文件夹下的所有 C++ 源文件,该文件夹本身位于当前正在处理的 CMakeList.txt 文件所在的同一文件夹中。 是否支持排除某些文件? 如果没有讨论 CONFIGURE_DEPENDS,这个答案是不完整的,它恢复了 CMake 构建的基本合同,即生成的构建系统拥有它需要知道何时重新配置的一切。 还必须注意 CMake 开发人员 "do not recommend using GLOB to collect a list of source files from your source tree." 这是一种非常强大的语言,在这样做之前应该暂停一下。如果你带着一个 bug 和一个 glob 来找 CMake 开发人员,他们会告诉你在帮助你之前先修复它。

以上是关于将文件夹下的所有文件添加到 CMake glob?的主要内容,如果未能解决你的问题,请参考以下文章

C++学习(四九二)cmake file的GLOB和GLOB_RECURSE

为啥 cmake 文件 GLOB 是邪恶的?

CMake基础教程(32)文件搜索指令FILE

CMake入门

CMake入门

问题解决glob.glob 如何匹配所有子文件夹下的文件 —— recursive=True