我如何使用cmake自动匹配所有子目录

时间:2018-10-23 12:29:15

标签: c++ cmake

提供的项目如下:

|--main.cpp
  |-A--a1.cpp
  |   |-a2.cpp
  |
  |-B--b1.cpp
      |-b2.cpp
|--CMakeLists.txt

如何将所有*.cpp(例如main.cppA/a1.cppA/a2.cppB/b1.cppB/b2.cpp)添加到cmake变量SRC?我希望我只需要一个CMakeLists.txt。顺便说一句,如果我需要排除某些.cpp,该怎么办?

2 个答案:

答案 0 :(得分:2)

如Alexander所提到的,您可以使用file(GLOB_RECURSE myVar myRegex)将与myRegex匹配的所有文件作为列表添加到myVar中。为了排除某些内容,您可以使用myRegex,或者可以使用list(FILTER myVar <INCLUDE|EXCLUDE> REGEX <regular_expression>)

过滤列表

但是请注意,在项目中添加另一个.cpp文件不会在重建时自动添加到目标中。您将需要显式重新配置项目以进行更改。从CMake 3.12开始,文件GLOBE和GLOBE_RECURSE还有一个选项CONFIGURE_DEPENDS,它将为您进行更新。

这是CMake文档中的注释:

  

注意:我们不建议您使用GLOB来收集源文件列表   从您的源代码树中。如果没有CMakeLists.txt文件,则在更改源时   添加或删除后,生成的生成系统将无法确定何时   要求CMake再生。 CONFIGURE_DEPENDS标志可能不起作用   可靠地在所有发电机上运行,​​或者如果在   未来无法支持它,使用它的项目将被卡住。甚至   如果CONFIGURE_DEPENDS能够可靠地运行,则仍然需要执行成本   每次重建都要检查。

答案 1 :(得分:1)

这就是您想要的:

file(GLOB_RECURSE SRC *.cpp)

有关更多信息:https://cmake.org/cmake/help/v3.0/command/file.html

要排除在外,您可以编写函数。

注意:,但我不建议使用'glob'。 最好在文件列表中使用“设置”。