我现在遇到的问题是,我只是想通过获取所有内容并删除少数不需要的零碎内容来管理我的源文件列表。我希望Cmake能为此提供很好的内置工具。
所以我可以从开始
file(GLOB A "Application/*.cpp")
我觉得我想创建另一个要删除的文件列表,我想告诉CMake:从列表A中删除列表B中的项目。
如果这是Python,我可能会做一些类似的事情:
C = [f for f in A if f not in B]
我可能把语法搞砸了,但我想知道是否有内置的支持来以更优雅的方式管理这些文件列表?
即使我可以做一些类似Python示例的事情,A是绝对路径的列表,所以构造B是笨拙的。
为什么是绝对路径?一旦你重新定位源,这似乎会破坏你的构建。
您可以使用带有REMOVE_ITEM选项的list命令:
list(REMOVE_ITEM <list> <value> [<value> ...])
看看:
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}")
请记住,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")
如果您喜欢Python,您可以使用execute_process生成源文件列表。也有可能使用列表。
但我建议您对源文件列表进行"硬编码"。文件命令文档状态:
我们不建议使用GLOB从源树中收集源文件列表。如果添加或删除源时没有CMakeLists.txt文件更改,则生成的构建系统无法知道何时要求CMake重新生成。