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