B.S*_*.S. 7 makefile build ninja
我经常看到有人声称 Ninja 比 Make 更快,更擅长支持增量构建,并且更擅长并行化。这是实现质量问题还是 Ninja 语言中的某些内容可以实现这一点?
我知道 Ninja 和 Make 使用不同的文件格式来描述任务的依赖关系图。我知道 Make 允许使用比 ninja 更高级的功能,例如 globs。如果使用这样的高级功能,那么 Make 执行的任务比 Ninja 更复杂,我们不能指望 Make 更快。这是一种不公平的比较。
但是,假设不使用这种高级功能。没有通配符,没有模式规则,只是一遍又一遍地重复基本的“out_file: in_file1, in_file2\n\tcommand to build”。不使用这种高级功能会使 Make 和 Ninja 之间的竞争环境在他们执行的任务方面保持平衡。
我的理解是,如果我们以这种方式限制 Makefile,那么 Ninja 文件和 Makefile 可以很容易地相互转换。这样对吗?
为什么在有限的 Makefile 上执行的 Make 比 Ninja 慢?或者仅仅是标准 Make 实现没有针对以这种方式构建的 Makefile 进行优化的情况?
And*_*eas 12
简而言之,Ninja 解析速度更快,并且具有减少解析量的内置功能。
其他构建系统都是高级语言,而 Ninja 的目标是成为汇编程序。
Ninja 文件通常是从其他 makefile 中“编译”的,这使其成为一个两步过程,而 Make 是一个步骤。两步可能比普通 Make 慢。因为大多数情况下只需要第二步,因此最终效果是速度更快。这有点类似于比较编译和解释的程序。
Ninja 向 Make 添加了多个功能。在 makefile 中实现这些会导致 makefile 更长、更复杂,因此需要更多的解析。