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>\nint 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:\Tools\mingw\bin\gcc
source_path=..\02_SW\01_Sources\
opts=-MMD -MF
CC_FLAGS = -I$source_path\02_MCAL\ -I$source_path\03_MCAL_generated -I$source_path\04_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\02_MCAL\Adc.c
build build/obj/Base.c.d: dep_gen $source_path\02_MCAL\Base.c

尝试新的构造系统 Ninja的更多相关文章

  1. Google 开发新的开源系统 Fuchsia

    google 最新os 下载 https://github.com/fuchsia-mirror/magenta 本文转自:http://www.oschina.net/news/76094/goog ...

  2. Unity笔记 英保通 Unity新的动画系统Mecanim

    Mecanim动画系统是Unity独一无二.强大灵活的人物动画系统.该系统赋予您的人类和非人类人物令人难以置信的自然流畅的动作,使它们栩栩如生.游戏中角色设计提高到了新的层次,在处理人类动画角色中可以 ...

  3. Unity 5 全局光照GI与新的烘焙系统初探

    http://blog.csdn.net/sparrowfc/article/details/45650013 GI是啥 Realtime GI,实时全局光照,听上去就是一个非常高大上的词,但是越高大 ...

  4. 解决android应用程序适用新老android系统版本方法

    老的android系统不能运行高版本系统的新方法,为了解决这个问题:  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ...

  5. 斯坦福新深度学习系统 NoScope:视频对象检测快1000倍

    以作备份,来源http://jiasuhui.com/archives/178954 本文由“新智元”(微信ID:AI_era)编译,来源:dawn.cs.stanford.edu,编译:刘小芹 斯坦 ...

  6. 新安装ubuntu系统的简单优化

    新安装的ubuntu系统,需要做下简单的优化,使其符合常用习惯,优化过程的命令与centos大都不一致,撰文备份,以备所需: 1.获取ubuntu系统root权限 在终端输入sudo passwd r ...

  7. STM32 Cube之旅-尝试新的开发方式

    尝试使用Cube进行一些开发学习,这里对此做一个梗概,先有一个全面的了解. 文章目录 Cube全家桶 CubeMX CubeIDE CubeProg 结语 Cube全家桶 曾几何时,ST刚推出Cube ...

  8. 在.Net Core 3.0中尝试新的System.Text.Json API

    .NET Core 3.0提供了一个名为System.Text.Json的全新命名空间,它支持reader/writer,文档对象模型(DOM)和序列化程序.在此博客文章中,我将介绍它如何工作以及如何 ...

  9. Centos7.X新安装linux系统基础配置

    普通Linux分区方式: /根分区 Linux系统必须要有的,相当于 Windows的C盘,系统程序相关的. /boot分区 存放内核相关程序 是可选的 5 6给200M,7给256M(工作中1-2G ...

随机推荐

  1. 初窥Java之四

    一.条件判断之if判断 语法格式:if(结果为布尔类型的结果值){ 功能执行语句; }else if(结果为布尔类型的结果值){ 功能执行语句; } ....{ }else{ 功能执行语句: } 注意 ...

  2. NSL:CPK_NN神经网络实现预测哪个样本与哪个样本处在同一层,从而科学规避我国煤矿突水灾难—Jason niu

    load water_data.mat attributes = mapminmax(attributes); P_train = attributes(:,1:35); T_train = clas ...

  3. 00-JAVA语法基础--课后作业

    题目:像二柱子那样,花20分钟写一个能自动生成30道小学四则运算题目的“软件”. package 课堂作业1; import java.util.Random; import java.util.Sc ...

  4. 【python】数据库

    No1: [SQLite] 插入 # 导入SQLite驱动: >>> import sqlite3 # 连接到SQLite数据库 # 数据库文件是test.db # 如果文件不存在, ...

  5. Codeforces 1118F1 Tree Cutting (Easy Version) (简单树形DP)

    <题目链接> 题目大意: 给定一棵树,树上的点有0,1,2三中情况,0代表该点无色.现在需要你将这棵树割掉一些边,使得割掉每条边分割成的两部分均最多只含有一种颜色的点,即分割后的两部分不能 ...

  6. git SourceTree 客户端 安装/使用教程

    使用过SourceTree 之后发现比乌龟好多了 风来了.fox 1.安装之前的必备 1.1 git 客户端 http://msysgit.github.io/ 安装就PASS了,总之是直接下一步.直 ...

  7. Codeforces.1082E.Increasing Frequency(思路)

    题目链接 \(Description\) 给定\(n\)个数.你可以选择一段区间将它们都加上或减去任意一个数.求最终序列中最多能有多少个数等于给定的\(C\). \(n\leq5\times10^5\ ...

  8. window下安装PIL

    PIL非官方库64 友情连接: https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/ ...

  9. django rest_framework 序列化组件详解

    为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...

  10. java加载类的顺序

    一.什么时候会加载类?使用到类中的内容时加载:有三种情况1.创建对象:new StaticCode();2.使用类中的静态成员:StaticCode.num=9;  StaticCode.show() ...