【问题标题】:Add all files under a folder to a CMake glob?将文件夹下的所有文件添加到 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

标签: cmake glob build-dependencies


【解决方案1】:

把我的评论变成答案

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

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

您的第二个示例将转换为

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

参考文献

【讨论】:

  • 这里可能会很好添加,也可以使用内置的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 开发人员,他们会告诉你在帮助你之前先修复它。
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 2019-05-13
  • 2014-01-21
  • 1970-01-01
相关资源
最近更新 更多