ninja和make都是通过脚本语言指定编译规则,然后调用gcc等编译器实现自动化编译,过程中会通过文件时间戳来进行增量构建。
Ninja 是Google的一名程序员推出的注重速度的构建工具Ninja 是一个专注于速度的小型构建系统。最初是为了对chromium、Swift等进行快速编译构建。设计哲学是通过包含描述依赖关系图的方式提供快速的构建。
其脚本文件后缀为 .ninja
ninja 构建文件的语法:创建一个 rule
和一个 build。
rule
有一个命令(command
)和描述(description
)参数(描述只是给人看的,所以你可以知道它在构建你的代码时在做什么)。
build
的语法是 build output_file: rule_name input_files
下面举个例(来自 ninja:一个简单的构建方式 | Linux 中国 - 知乎):
rule svg2pdf
command = inkscape $in --export-text-to-path --export-pdf=$out
description = svg2pdf $in $out
build pdfs/variables.pdf: svg2pdf variables.svg
其脚本文件后缀为 .makefile
这个语法网上资料太多了,就不举例了。功能非常强大,具有各种高级功能,比如函数、内置规则。可以看我之前写的这个文章(C语言工程的通用makefile模板(干货!!!)_标biao的博客-CSDN博客_makefile通用模板)
Ninja 舍弃了各种高级功能,语法和用法非常简单,给它指定好了具体详细要做什么,所以启动编译的速度非常快。根据 [Chromium](http://neugierig.org/software/chromium/notes/2011/02/ninja.html) 的实际测试:在超过 30,000 个源文件的情况下,也能够在1秒钟内开始进行真正的构建。与之相比,通过资深工程师进行编写的 Makefiles 文件也需要10-20秒才能开始构建。但是ninja的功能可能不如makefile强大。
原则上,如果你对自己的项目构建速度感觉满意,就不要用 Ninja,用makefile就行了,功能强大。
而cmake是一个生成 .ninja 和 .makefile 的工具。因为担心很多人不熟悉makefile文件和ninja文件的写法,所以cmake只需要用户通过对源码文件的简单描述(就是CMakeLists.txt文件),就能自动生成一个project的makefile文件或者ninja文件,然后就可以通过ninja或者make进行启动编译了,很多IDE都在用cmake作为项目管理工具。
参考文章:
ninja VS cmake_lincong-pro的博客-CSDN博客_cmake ninja
ninja:一个简单的构建方式 | Linux 中国 - 知乎
https://www.slant.co/topics/4263/versus/~ninja_vs_cmake_vs_gnu-make