Ninja 是 Chrome 项目的构建工具,用来替换经典工具 make,目前这个开源工具已经被很多其它项目采用。据项目作者描述,创建这个新的构建工具,主要是为了提升大型项目的编译速度。
由于 Ninja 的设计目标之一是“必须易于嵌入大型构建系统”,所以,像写 Makfile 那样手写规则文件,并不是它的目标; Ninja 的项目作者说,Ninja 构建文件使用的语言“简单到了不便于人类书写”的程度。Ninja 的规则文件中,并没有条件语句或是基于文件后缀的规则,相反,有的仅仅是一个个列表。这些列表记录了确切的输入文件路径,以及所产生的确切结果。因为这种简单的表达并不需要额外的解释,所以,在运行时,这些规则文件能够被快速载入。
所以,通常情况下,使用 Ninja 时需要一个额外的工具,来实现高层次的构建概念理解。好在已经有很多现成的工具来完成这件事,比如鼎鼎大名 CMAKE,已经可以直接生成 Ninja 的规则文件。
今天实验用到另一个超小的基于 Python 的工具,pyrate-build。项目作者描述它是一个“build file generator targeting Ninja”。
1. 安装
Ninja 并不需要额外的依赖,你可以直接使用相应平台的二进制文件,Linux 或者 Windows;安装不安装的都无所谓。当然,Linux 下最好还是用 apt-get 之类的安装。它的 windows 可执行文件只有 500k。
pyrate-build 的安装更简单,它只需要一个文件。所以,同样的,你也可以直接把它放到编译目录下。或者使用 pip 来安装。
我这里在 Linux 下作的实验,Ninja 是用 apt 装的,pyrate-build 脚本直接放在了编译目录下。
2. 编译
只尝试了 pyrate-build 官网上的实验:
$ echo -e '#include <cstdio> int main() { printf("Ahoy World!"); return 0; }' > test.cpp $ echo -e "executable('test', 'test.cpp')" > build.py $ python pyrate build.py $ ninja $ ./test
然后,修改了 build 目录,对 build.py 做了简单修改。
default_context.basepath = 'build' default_context.basepath_object_file = 'build/obj'
executable('test', 'test.cpp')
当然,指定目录似乎还有很多其他的方式,暂不作深入研究。
所以,如果你在 windows 下组织一个独立于 IDE 的新项目,你只需要一个 500k 的二进制文件,以及一个 python 脚本,就可以轻松组织构建啦~
想用 Ninja 作为单片机的构建工具,但是供应商的编译器不支持生成 depfile,所以考虑先使用 gcc 作为 depfile 的生成工具。下面的脚本实验可行,考虑有空了进行整合:
CC = C:Toolsmingwingcc source_path=.. 2_SW 1_Sources opts=-MMD -MF CC_FLAGS = -I$source_path 2_MCAL -I$source_path 3_MCAL_generated -I$source_path 4_OS -MM rule dep_gen command = $CC $CC_FLAGS $in $opts $out description = dep_gen(c) $out build build/obj/Adc.c.d: dep_gen $source_path 2_MCALAdc.c build build/obj/Base.c.d: dep_gen $source_path 2_MCALBase.c