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

Posted

技术标签:

【中文标题】CMake / Ninja:当内容未知时递归“清理”输出目录......?【英文标题】:CMake/Ninja: Recursive "cleaning" of output directories when contents are unknown...? 【发布时间】:2018-12-11 23:55:12 【问题描述】:

同事们!

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

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

当尝试“清理”时,Ninja 用户会收到如下错误:

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

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

在配置或生成时无法知道文件列表和子目录名称(“dirABC”下方)。名字真的只有跑了才知道。

我的问题是:

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

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

在 cmake 中,我想向***“干净”目标添加一个依赖项,以告知如何实际清理,但 cmake 不允许这样做...

【问题讨论】:

【参考方案1】:

我解决这个问题的方法是定义一个新目标“清洁”:

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”时,“whatever-clean”目标将首先运行,然后默认的“clean”将运行。

【讨论】:

以上是关于CMake / Ninja:当内容未知时递归“清理”输出目录......?的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 CMake 和 ninja 构建时,clang++ 会忽略 -MD 标志

CMake/Ninja 试图编译已删除的“.cpp”文件

CMake、Ninja 和 Visual Studio 2019 重建一切

使用 CMake + Ninja 使用 GIT 下载依赖项

CMake 找不到 Ninja

C++学习(四四二)cmake ninja build.ninja rules.ninja