Have a try on Ninja_陶超强的博客-程序员信息网_陶超强

技术标签: linux  

My code is compiling

什么是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://cyukang.com/2012/12/13/have-a-try-for-ninja.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/w5nner/article/details/17551357

智能推荐

Qt 之 show,hide,setVisible,setHidden,close 等小结_dbzhang800的博客-程序员信息网_qt setvisible

QWidget和QDialog中让人极易混淆的几个函数。有些负责控制界面的显示与隐藏,有些负责对象的删除。比如:show,hide,setVisible,setHidden,close,done, accept, reject

Xilinx FPGA引脚txt文件导入excel中_小翁同学的博客-程序员信息网

需求为了把xilinx FPGA的官方引脚文件txt转成excel文件(实际官网中有对应的csv文件就是excel文件了。。。)xilinx FPGA引脚地址:https://china.xilinx.com/support/package-pinout-files.html流程(1)把下载好的txt引脚文件导入excel中:(2)选择下载的txt引脚文件经过文本...

FW150U构建无线局域网【模拟AP功能设置指南】_三少GG的博客-程序员信息网_fw150us密码

迅捷网络: FW150U 驱动http://www.fastcom.com.cn/Download/detail?pd=8软件名称:FW150U_3.0/5.0_驱动程序运行环境:WinXP/XP64/Vista/Vista64/Win7/Win7 64软件大小:29.98MB上传时间:2011-08-03

java批量导入数据到es中出现数据重复问题解决方案_叶不二的博客-程序员信息网_es数据重复问题

今天在网上找了一个批量数据导入到es中的java代码,代码主要逻辑如下:// 读取要导入数据的文件BufferedReader br = new BufferedReader(new FileReader( "D:\\test\\test.txt"));String json = null;int count = 0;// 开启批量插入BulkRequestBuilder bulkR

电脑键盘部分按键失灵_win10键盘个别按键失灵的原因及解决方法_weixin_39694016的博客-程序员信息网

相信许多小伙伴都遇到过win10键盘个别按键失灵的情况,其他按键都能使用,造成正在进行的工作和游戏无法再继续进行下去。如果台式机键盘坏了,重新换键盘就可以了,但是笔记本换键盘恐怕就没那么容易了。其实键盘个别按键失灵可能和电源设置有关系,大家可以参考下文教程修复一下。具体方法如下:win8.1 - 14 、由于在另一个系统中键盘没有问题,所以考虑到可能是软硬件冲突导致的,所以从设置入手。window...

MySQL - 当LIMIT 进行分页时,为什么出现了重复数据_Soinice的博客-程序员信息网

哦,这时写的一个破SQL,遗留了个问题,没有去注意,所以造成了,有重复数据。因为引用了 PageHelper 插件,期初还以为是 插件有问题。后来想想,毕竟整个框架都是用的这个插件,就算有问题早应该会出现了。所以,第一时间想到了SQL,的确,去了排序就没有问题。说在前面数据库分页是后台经常要使用的技术手段,有时候进行数据库查询会根据业务需要对某一字段排序,那么当待排序字段值相同时,我们...

随便推点

left join关联查询一对多数据重复问题解决方案_left join 一对多_爱叨叨的程序狗的博客-程序员信息网

写在前面:使用准则:在使用左右连接时,一定要保障主表与关联表的on条件是1:1的关系,以保障正常查询主表数据。实例# 车主表create table owner( id int(10) auto_increment primary key, owner_name varchar(10) null, brand_id int(10) null);# 车辆表create table vehicle( id

MacOs python from mpi4py import MPI 报错_呆博士实验室的博客-程序员信息网

今天在读其他人的程序时遇到了from mpi4py import MPI报错Reason: image not found搜索了以后发现了问题所在refer1但是在sudo rm -r ./mpi4py后使用pip(更新前后)和conda均不能安装,错误为error: Cannot compile MPI programs. Check your configuration!!!...

A quick message queue benchmark: ActiveMQ, RabbitMQ, HornetQ, QPID, Apollo_hanruikai的博客-程序员信息网_rabbitmq benchmark

Lately I performed a message queue benchmark, comparing several queuing frameworks (RabbitMQ, ActiveMQ…).Those benchmarks are part of a complete study conducted by Adina Mihailescu, and everything

【数论】POJ1845 Sumdiv_aizhiyan2320的博客-程序员信息网

最近本渣渣做了一道快搞死我的题,就是这个!下面隆重给出题目以及链接:SumdivTime Limit:1000MSMemory Limit:30000KTotal Submissions:29696Accepted:7312DescriptionConsider two natural numbe...

Replication_Error:Relay log write failure:could not queue event from master_Mr_HanSong的博客-程序员信息网

刚刚突然发现DB Master1(当前读写)磁盘满了,DB Master2(当前不对外提供写)replication 抛出异常:Relay log write failure:could not queue event from master,并且Slave_IO_Running: No。_1671465600

J2ME安全应用——Bouncy Castle Crypto API _zypsg的博客-程序员信息网_bouncy castle api接口文档

http://blog.csdn.net/raorq/archive/2010/03/29/5427260.aspx 1、前言随着移动商业的不断发展,对于移动用户和无线应用程序开发人员而言,安全性正在成为一个重要方面。无线通信是无线电波拦截容易获取的目标,而无线设备几乎没有任何计算能力来支持所有通信数据的强加密

推荐文章

热门文章

相关标签