使用 Ninja 构建系统,我可以清理中间构建产品吗?
Using the Ninja build system, can I clean intermediate build products?
当我使用 CMake 生成树外 Ninja 构建时,能够删除中间构建产品(即目标文件和静态库)将很有用,以便节省磁盘 space我们的 CI 服务器。有办法吗?
可以使用 Ninja 按规则进行清理,但仅使用 Ninja 无法知道哪些规则生成中间体;相反,我们必须求助于 shell 脚本:
grep "^rule.*\(_COMPILER_\|_STATIC_LIBRARY_\)" rules.ninja | \
cut -d' ' -f2 | xargs -n1 ninja -t clean -r
这会为那些生成目标文件和静态库的规则搜索 rules.ninja 文件,然后对每个规则调用 ninja -t clean -r <rule>
以进行实际清理。 Windows 上的等效功能通过以下方式实现:
FOR /f "tokens=2" %%R IN ('findstr "_COMPILER_ _STATIC_LIBRARY_" rules.ninja') DO (
ninja -t clean -r %%~R
)
这确实是一个 hack,但它为我们节省了大量磁盘空间 space,所以值得记录,我认为。
当我使用 CMake 生成树外 Ninja 构建时,能够删除中间构建产品(即目标文件和静态库)将很有用,以便节省磁盘 space我们的 CI 服务器。有办法吗?
可以使用 Ninja 按规则进行清理,但仅使用 Ninja 无法知道哪些规则生成中间体;相反,我们必须求助于 shell 脚本:
grep "^rule.*\(_COMPILER_\|_STATIC_LIBRARY_\)" rules.ninja | \
cut -d' ' -f2 | xargs -n1 ninja -t clean -r
这会为那些生成目标文件和静态库的规则搜索 rules.ninja 文件,然后对每个规则调用 ninja -t clean -r <rule>
以进行实际清理。 Windows 上的等效功能通过以下方式实现:
FOR /f "tokens=2" %%R IN ('findstr "_COMPILER_ _STATIC_LIBRARY_" rules.ninja') DO (
ninja -t clean -r %%~R
)
这确实是一个 hack,但它为我们节省了大量磁盘空间 space,所以值得记录,我认为。