CMake / Ninja:内容未知时递归“清除”输出目录...?

时间:2018-12-11 23:55:13

标签: cmake ninja

同事!

我们在构建和回归系统中使用“ 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不允许这样做...

1 个答案:

答案 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”时,将首先运行“完全清洁”目标,然后将运行默认的“清洁”。