最近想试试使用 Ninja 编译,毕竟 Ninja 是以编译速度为主要目标的构建系统,下面记录下安装使用的过程。

# 1. 安装

首先将 ninja 的仓库的 release 分支下载或者 clone 下来:

$ git clone https://github.com/ninja-build/ninja.git && cd ninja
$ git checkout release

官方文档这里地址协议使用了 git://github.com/ninja-build/ninja.git,但现在使用 git 会报错:

$ git clone git://github.com/ninja-build/ninja.git && cd ninja
Cloning into 'ninja'...
fatal: remote error:
  The unauthenticated git protocol on port 9418 is no longer supported.

这是最近 github 取消了 git 协议,详情参见 Improving Git protocol security on GitHub

然后可以使用 python 脚本或者 cmake 去构建可执行程序:

python:
$ ./configure.py --bootstrap
cmake:
$ cmake -Bbuild-cmake
$ cmake --build build-cmake

我这次使用的是 python 去构建的,然后遇到 re2v 相关的报错:

h
warning: A compatible version of re2c (>= 0.11.3) was not found; changes to src/*.in.cc will not affect your build.

这是缺少了 re2c,使用 yum 或者 apt-get 安装完就没了,然后在同目录会生成一个 ninja 的可执行文件,拷贝至 $PATH 对应目录中即可:

$ ninja --version
1.10.2

安装完成后可以使用目录下的 ninja_test 测试一下:

$ build-cmake/ninja_test
[343/343] ElideMiddle.ElideInTheMiddle
passed

然后根据官方文档,可以使用 misc 文件夹下的各种文件,实现 bash、zsh 的补全等功能,使用方法在对应文件的注释中,不过目前感觉没啥补全的需要,暂时没研究:

misc

# 2. 使用

ninja 在编译时会去寻找 .ninja 的编译配置文件,默认是 build.ninja ,配置文件的格式大致如下:

cflags = -Wall

rule cc
  command = gcc $cflags -c $in -o $out

build foo.o: cc foo.c

假如项目本身使用 cmake,写好了 CMakeList,可以直接使用 cmake -G Ninja 生成 build.ninja 文件,然后就可以使用 ninja 指令编译啦~

# 3. 编译结果

最后我分别使用 cmake 和 ninja 在 24 核的方式下进行了一次完整编译我们项目,结果如下:

cmake

<center>cmake</center>

ninja

<center>ninja</center>

ninja 大致快了 1min,10% 不到点,提升还可以,而且安装和配置也很轻松,还是不错的~

# 参考资料

  • Ninja, a small build system with a focus on speed
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Nirvana 支付宝

支付宝