CMake/Ninja:内容未知时输出目录的递归 "cleaning"...?

CMake/Ninja: Recursive "cleaning" of output directories when contents are unknown...?

同事们!

我们使用 "cmake" 构建和回归系统。一些用户使用 "ninja" 和其他 "make" 作为 cmake 的底层生成器。

我们有一些自定义目标调用外部工具生成包含各种子目录和文件的目录。

尝试 "clean" 时,Ninja 用户会收到如下错误:

ninja: error: remove(<dirABC>/<subdirXYZ>): Directory not empty
ninja: error: remove(<dirABC>): Directory not empty
...

我将输出目录列为自定义构建目标的输出("dirABC" 以上)。但这并不能启用递归删除。

文件列表和子目录名称(在 "dirABC" 下方)无法在配置或生成时获知。名字真的只有在 运行ning 之后才知道。

我的问题是:

ninja 用户如何在 运行 "ninja clean" 时删除这些输出目录及其内容?

注意 "make" 用户没有这个问题。我用 "ADDITIONAL_MAKE_CLEAN_FILES" 属性 标记目录。 Make 在顶级输出目录上执行 "rm -rf",我们就干净了。关键是那个“-r”!

在 cmake 中,我想向顶级 "clean" 目标添加一个依赖项以告知如何实际清理,但 cmake 不允许这样做...

我解决这个问题的方法是定义一个新目标 "Clean":

if(${CMAKE_GENERATOR}" STREQUAL "Ninja")
  add_custom_target(Clean COMMAND ninja clean)
else()
  add_custom_target(Clean COMMAND ${MAKE} clean)
endif()

现在我有了第一个 class 可以附加东西的顶级目标:

…
  add_dependencies(Clean whatever-clean)
…

当用户键入 "ninja Clean" 或 "gmake Clean" 时,"whatever-clean" 目标将首先 运行,然后默认 "clean" 将 运行 .