Ninja介绍
什么是Ninja
在Unix/Linux下通常使用Makefile来控制代码的编译,但是Makefile对于比较大的项目有时候会比较慢,看看上面那副漫画,代码在编译都变成了程序员放松的借口了。所以这个Google的程序员在开发Chrome的时候因为忍受不了Makefile的速度,自己重新开发出来一套新的控制编译的工具叫作Ninja,Ninja相对于Makefile这套工具更注重于编译速度。除了Chrome现在还有一些其他的比较大的项目也在开始使用Ninja,比如LLVM。我试用了一下感觉还是不错,比如编译Cmake时间大概是原来的1/4。Ninja试用C++实现,其支持的语法非常简单,作者在这里说明了为了控制复杂度。
代码如何编译
其实对于C/C++和很多其他程序的编译都是一个道理,就是把一些源代码文件编译成目标文件,或者有的目标文件再编译到一个库里,然后再链接起来。所以Ninja的配置文件分为两个部分,rule和文件依赖关系。看个简单的例子:
cc=gcc cflags= -g -c
rule cc command = $cc $cflags $in -o $out rule link command = $cc $in -o $out rule cleanup command = rm -rf *.exe *.o
build func.o : cc func.c
build main.o : cc main.c
build app.exe : link main.o func.o
build all: phony || app.exe
build clean: cleanup
非常易懂,编译的可执行未见叫做app.exe, 其中有三条rule: cc, link, cleanup。看看这个官方的试用手册,还有一些附加参数可以加在rule的下面,比如description用来在编译的时候显示出来。Ninja还有个比较好玩的功能就是Ninja -t graph all命令,这可以用来生成编译时候的依赖关系,可以用dot来生成图片等。Ninja的实现也可以大概推测到,根据用户给的依赖关系图,并行 地编译各个文件。
使用Ninja的一个问题就是需要生成这个build.ninja文件,对于大型项目来说这样一条一条地写配置文件是不可能的。幸好我们可以使用Cmake来生成这个配置文件,Cmake对应的是automake这样的东西。在Cmake的最新版本中已经支持参数Camke -G Ninja,Cmake会根据用户给定的CMakeLists.txt来生成build.ninja文件。而CmakeLists文件相对来说要简单一些,只要写清楚编译的可执行文件的名字,和其依赖的包含main函数的源文件。把我的迷宫小项目来举个例子,在项目文件夹下写配置文件CMakeLists.txt:
cmake_minimum_required(VERSION 2.8) project (Maze) add_library(maze A_star.cpp Algorithm.cpp DFS_L.cpp DFS_R.cpp DisjSets.cpp Maze.cpp) add_executable(Maze.exe main.cpp) target_link_libraries(Maze.exe maze)
add_library写明了生成一个叫做maze.a的库文件,然后和main.cpp编译出来的main.o生成可执行文件,写好CmakeList.txt后运行Cmake -G Ninja, 然后运行ninja all就能编译这个工程。具体的Cmake语法参考这里,对于不少项目来说Cmake已经足够使用,只是我觉得Cmake还是稍微复杂了一点。
我这样来使用
整个Ninja是使用C++写的开源项目,如果我们想增加一些自己的feature可以hack一下,不过作者估计不会接受增加语法支持的patch。我准备做一个小的hack来自动分析我当前的源码,自动生成build.ninja文件,不要求处理所有的复杂情况,只是分析.cc和.c,自动检测main函数文件。最后用户只用配置链接参数就可以了。我觉得这样用起来就非常方便了,待完成中,顺便看看Ninja的内部实现。
http://martine.github.io/ninja/
Ninja介绍的更多相关文章
- Ninja - chromium核心构建工具
转自:http://guiquanz.me/2014/07/28/a_intro_to_Ninja/ Ninja - chromium核心构建工具Jul 28, 2014 [在线编辑] 缘由 经过上次 ...
- 《Secrets of the JavaScript Ninja》:JavaScript 之运行时代码
最近,在阅读 jQuery 之父 John Resig 力作:Secrets of the JavaScript Ninja(JavaScript忍者秘籍).关于第九章提及的 JavaScript 之 ...
- WebRTC编译系统之GYP,gn和ninja
GN(Generate Ninja)来生成构建脚本,使用 ninja 来构建. gn 的介绍在这里:https://www.chromium.org/developers/gn-build-confi ...
- Unity2d 骨骼动画1:介绍
http://bbs.9ria.com/thread-401613-1-1.html by Orlando Pereira and PedroPereira3 days ago2 Comments 在 ...
- Ninja——小而快的构建系统
介绍 Ninja 是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度 ...
- 使用 Ninja 代替 make
使用 Ninja 代替 make 摘自:https://www.jianshu.com/p/d118615c1943 22017.01.14 11:41:44字数 1408阅读 26336 前言 在传 ...
- Ninja构建系统入门
1. 介绍 开篇先介绍.先甩资料给大家看,之后再自己演示一下基本使用.Ninja 是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来 ...
- 浅析鸿蒙中的 Gn 与 Ninja(一)
目录: Ninja简介 make 的 3 个特性 举例说明Ninja 的用法 如何向构建工具 Ninja 描述构建图 后记 鸿蒙系统的编译构建是基于 Gn 和 Ninja 完成的,那么 Gn 和 Ni ...
- SEAL库 - 安装和介绍
本篇文章介绍:SEAL同态库的安装和简单使用 注:使用Clang++编译的Microsoft Seal比使用GNUG++编译的Microsoft Seal具有更好的运行时性能. 1. cmake:适应 ...
随机推荐
- RSA非对称加密Java实现
原文 加密基础方法类 import java.security.MessageDigest; import sun.misc.BASE64Decoder; import sun.misc.BASE64 ...
- post(c),get(r),put(u),delete(d)
http://whui0110.iteye.com/blog/1682388看这个帖子知道人们常说的幂等意思就是可以重复执行,结果是一样的:帖子中说put(update)是幂等的,其实update v ...
- HTTP缓存控制总结
引言 通过网络获取内容既缓慢,成本又高.大的相应需要在客户端和服务器之间多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了通信的成本.因此,缓存和重用以前获取到的资源的能力成为性能优化 ...
- Xcode7 免证书真机测试
Xcode很早就有个免证书测试,今天我自己也测试了一把,还是挺好用的,接下来,我就说一下我的大体过程: 注意:一定要让你的真机设备的系统版本和app的系统版本想对应,如果不对应就会出现一个很常见的问题 ...
- nginx+fastcgi php 使用file_get_contents、curl、fopen读取localhost本站点.php异常的情况
原文:http://www.oicto.com/nginx_fastcgi_php_file_get_contents/ 参考:http://os.51cto.com/art/201408/44920 ...
- CodeForces 618C CodeForces 618C
第一反应是在凸包上随便找一条边,然后找剩下n-2个点里面距离这条边最短的一个点,这三点就构成了符合要求的三角形..然而..精度被卡死. 换种思路,随便找两个点P1,P2,找剩下n-2个点中哪一个点与P ...
- 子序列和问题 acm
题目描述 给定一个序列 {a1,a2,…,an},定义从a[l]到a[r]的连续子序列的和为sum[l,r],即sum[l,r]=sigma{ai},l<=i<=r.(1<=l< ...
- H3C inode for OSX 10.10 校园网客户端亲测可用
1.打开终端 2.输入以下命令 sudo /library/StartupItems/iNodeAuthService/iNodeAuthService start 3.输入管理密码 4.打开客户端联 ...
- mysql 之SQL语句--NSERT SELECT ON DUPLICATE KEY UPDATE的写法
Table source CREATE TABLE `source` ( `key` int(11) NOT NULL AUTO_INCREMENT, `data` int(11) DEFAULT N ...
- iOS正则表达式 分类: ios技术 2015-07-14 14:00 35人阅读 评论(0) 收藏
一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...