CMake:管理源文件列表

Ken*_*nny 3 cmake

我现在遇到的问题是,我只想通过抓住所有内容来管理我的源文件列表,并删除一些我不需要的几率.我希望Cmake为此提供了很好的内置工具.

所以我可以从:

file(GLOB A "Application/*.cpp")
Run Code Online (Sandbox Code Playgroud)

我觉得我想创建另一个要删除的文件列表,我想告诉CMake:从列表中删除列表B中的项目.

如果这是Python我可能会做类似的事情:

C = [f for f in A if f not in B]
Run Code Online (Sandbox Code Playgroud)

我可能已经搞砸了这种语法,但我想知道是否有内置支持以更优雅的方式管理这些文件列表?

即使我可以做类似我的Python示例,A是绝对路径列表,因此构造B是笨重的.

为什么绝对路径呢?一旦你重新定位源代码,这似乎会破坏你的构建.

Leo*_*rdo 7

您可以使用带有REMOVE_ITEM选项的list命令来执行此操作:

list(REMOVE_ITEM <list> <value> [<value> ...])
Run Code Online (Sandbox Code Playgroud)

看一看:

file(GLOB FOO *)
set (ITEMS_TO_REMOVE "item;item2;item3")
message(STATUS "FOO is ${FOO}")
list(REMOVE_ITEM FOO ${ITEMS_TO_REMOVE})
message(STATUS "FOO is now ${FOO}")
Run Code Online (Sandbox Code Playgroud)

请记住,返回的路径file(GLOB)是绝对的,您可能希望通过预先添加${CMAKE_CURRENT_LIST_DIR}到每个项目来构建要删除的项目列表:

set (ITEMS_TO_REMOVE "${CMAKE_CURRENT_LIST_DIR}/item;
                      ${CMAKE_CURRENT_LIST_DIR}/item2;
                      ${CMAKE_CURRENT_LIST_DIR}/item3")
Run Code Online (Sandbox Code Playgroud)

  • 在官方的 cmake 文档中并不明显,可以像这样以分号分隔的方式将多个值传递给“REMOVE_ITEM”。谢谢解释。 (2认同)