同事!
我们在构建和回归系统中使用“ cmake”。有些用户将“忍者”用作cmake的基础生成器。
我们有一些自定义目标,这些目标调用外部工具来生成带有各种子目录和文件的目录。
当尝试“清理”时,忍者用户会收到类似以下错误:
ninja: error: remove(<dirABC>/<subdirXYZ>): Directory not empty
ninja: error: remove(<dirABC>): Directory not empty
...
我将输出目录列出为我的自定义构建目标的输出(上面的“ dirABC”)。但这并不能启用递归删除。
在配置或生成时无法知道文件和子目录名称的列表(在“ dirABC”下方)。名称实际上只有在运行后才知道。
我的问题是:
忍者用户在运行“忍者清理”时如何删除这些输出目录及其内容?
请注意,“ make”用户没有此问题。我使用“ ADDITIONAL_MAKE_CLEAN_FILES”属性标记目录。 Make在顶级输出目录上执行“ rm -rf”,我们很干净。关键是“ -r”!
在cmake中,我想向顶级“ clean”目标添加一个依赖项,以告知如何实际进行清理,但是cmake不允许这样做...
答案 0 :(得分:0)
我解决此问题的方法是定义一个新目标“ Clean”:
if(${CMAKE_GENERATOR}" STREQUAL "Ninja")
add_custom_target(Clean COMMAND ninja clean)
else()
add_custom_target(Clean COMMAND ${MAKE} clean)
endif()
现在,我有了一个一流的顶级目标,可以将其附加到:
…
add_dependencies(Clean whatever-clean)
…
当用户键入“ ninja Clean”或“ gmake Clean”时,将首先运行“完全清洁”目标,然后将运行默认的“清洁”。