将文件夹下的所有文件添加到 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?的主要内容,如果未能解决你的问题,请参考以下文章