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学习笔记

    1.封装 封装可以理解为把方法封在类中,用打时候可以直接拿,就好比你要上学,类就是书包而方法就是书,要用方法打时候直接从书包中拿书就行. 2.类语法细节 public权限修饰 public是个公开类, ...

  2. fastAdmin进阶

    基本知识流程一栏链接 bootstrapTable fastadmin系统配置(符内置规则): fastadmin默认的controller已实现的方法 一张图解析fastadmin的表格: fast ...

  3. Java 之 Web前端(三)

    1.JSP a.全称:Java Server Page b.运行:翻译.编译.类装载.类实例化.(初始化.服务.销毁 (这三点为Servlet的生命周期)) 2.JSP的基本组成 a.HTML模板 注 ...

  4. CodeForces 1117C Magic Ship (循环节+二分答案)

    <题目链接> 题目大意: 给定起点和终点,某艘船想从起点走到终点,但是海面上会周期性的刮风,船在任何时候都能够向四个方向走,或者选择不走,船的真正行走路线是船的行走和风的走向叠加的,求船从 ...

  5. hr相关的

    1.自我介绍? 2.为什么要离职?之前几家公司离职的原因分别是什么? 3.从上一家公司离职的原因? 4.目前就职的公司最大的收获是什么? 从上家公司到目前公司的最大收获是什么,要突出目标明确,在当前的 ...

  6. linux进阶命令第一天

    1.history -c 清空历史命令     保存的目录 vim ~/.bash_history history -w 立即把内存中的数据写入历史文件中 vim /etc/profile 默认配置文 ...

  7. 【ABP】ABP跨域调用API时出现的问题

    public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAss ...

  8. opencv3 学习笔记(二)

    1.OpenCv 颜色追踪 import cv2import numpy as npcap=cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1 ...

  9. OSPF补全计划-0 preface

    哇靠,一看日历吓了我一跳,我这一个月都没写任何东西,好吧,事情的确多了点儿,同事离职,我需要处理很多untechnical的东西,弄得我很烦,中间学的一点小东西(关于Linux的)也没往这里记,但是我 ...

  10. iOS中 H5的input输入框focus()无法自动拉起键盘(解决方法)

    ios的hybird APP 无法使用focus()获取焦点和键盘的问题. 解决方案 原来,在App的配置文件(config.xml),里面默认会有一句 1 <preference name=& ...