C++ 编译系统Ninja

博客首页 » C++ 编译系统Ninja

发布于 25 Jul 2014 09:32
标签 blog
C++ 编译系统Ninja是随Google的Chronium诞生的编译系统。特点是快,这对于大系统自然很重要。

找了找,国内的资料还真不多。
首先看看官方的说法吧。
https://github.com/martine/ninja
http://neugierig.org/software/chromium/notes/2011/02/ninja.html

国内的几篇文章是

文章1

http://blog.csdn.net/kl222/article/details/16916823

小试 Ninja
Ninja 是最近冒出来的一个 build system,它很像 make,然而效率更高,对大项目支持更好。当然我用 Ninja 和效率无关(我又没有那种有几百个中间目标的 C++ 项目要 build),纯粹是因为 mingw-builds 里的 make.exe 对 PATH 的识别有问题而已。

Ninja 使用 build.ninja 文件来定义构建规则。和 Makefile 里的元编程不同,build.ninja 几乎是完全静态的,动态生成依赖其他工具,如 gyp 或者 CMake。下面是我用来构建 typeof.net 的文件:

forceFlags =
rule generate_site
command = moei.cmd ./compile.moe $forceFlags
rule compile_less
command = lessc.cmd $in $out
rule publish_site
command = git push origin master

build rc/css/style.css: compile_less rc/css/style.less
build style: phony rc/css/style.css
build all: generate_site style
build force: generate_site style
forceFlags = force
build publish: publish_site

default all
是不是感觉有点坑爹?好吧,构建页面的过程是由一个 Moescript 脚本负责的,ninja 文件只是负责把它封装下。在 Ninja 中,每条构建规则由 build 起始,默认规则则由 default 指定。构建规则的形式为:

build 目标文件 : 转换规则 依赖文件a 依赖文件b …
变量覆写(若有)
转换规则相当于 makefile 里缩进中的命令,但是有更好的控制。Ninja 执行的逻辑是,在希望构建 A: R B C 的时候,先构建依赖文件 B、C,然后计算规则 R 得到一组变量,进而执行其中 command 变量指示的命令完成构建。Ninja 的转换规则可以使用一系列的预定义变量,例如 $in 和 $out,表示依赖文件表和输出文件的名字。

由于是优化效率的设计,Ninja 并没有提供很强大的函数功能(对比 make),相比之下 Ninja 的池(Pool)机制可以很好地管理大型项目构建时的并发编译/链接。当然作为一个写 nodejs 的,这种特性也用不上,权当了解了。

文章2

http://blog.sina.com.cn/s/blog_6114e8c80101arpu.html

使用ninja编译LLVM和Clang (2013-09-30 14:17:17)
标签: llvm的安装 it 分类: llvm
google编译chrome的编译工具。优点是速度快使用make编译llvm-clang花费3个小时左右,使用ninja只需要10多分钟
安装ninja
1)获得并编译ninja的代码
$ git clone git://github.com/martine/ninja.git
$ cd ninja/
$ ./bootstrap.py
2)上述步骤会在当前目录下产生一个ninja的可运行文件。使用以下命令把它复制到/usrlocal/bin下
$ sudo cp ninja /usr/local/bin/
$ sudo chmod a+rx /usr/local/bin/ninja
安装CMake去CMake官方网站下载最新版本(至少需要CMake 2.8.9.),并且安装http://www.cmake.org/cmake/resources/software.html 可以在终端下运行cmake 命令查看其是否支持Ninja。
使用ninjia编译和安装LLVM假设build目录是$OBJ,LLVM根目录是$LLVM_HOME。
$ mkdir $OBJ
$ cd $OBJ
$ cmake -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON $LLVM_HOME
$ ln -s $PWD/compile_commands.json path/to/llvm/source/
$ ninja #编译
$ sudo ninja #安装

http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html How To Setup Clang Tooling For LLVM#(Experimental) Using Ninja Build System
http://cyukang.com/2012/12/13/have-a-try-for-ninja.html Have a try on Ninja
http://martine.github.com/ninja/manual.html Ninja的官方帮助手册http://www.linux-ren.org/thread-58955-1-1.html 谷歌开源Chrome编译系统


本页面的文字允许在知识共享 署名-相同方式共享 3.0协议和GNU自由文档许可证下修改和再使用,仅有一个特殊要求,请用链接方式注明文章引用出处及作者。请协助维护作者合法权益。


系列文章

文章列表

  • C++ 编译系统Ninja

这篇文章对你有帮助吗,投个票吧?

rating: 0+x

留下你的评论

Add a New Comment
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License