一、简介:
Ninja是一名Google的一名程序员推出的注重速度的构建工具。一般在Unix/Linux上程序通过make/makefile来构建编译,大大而ninja通过将编译任务并行组织,提高了构建速度。
PS:1、编译(Compile),指源代码文件通过编译器转化为目标文件的过程。编译输入文件是C/CPP/H等文本文件,输出的是OBJ目标文件。
PS:(1)obj(object)文件是3D模型文件格式,是程序编译后的二进制文件,在通过链接器和资源文件就成了exe文件;obj文件又称为目标文件或中间文件。
(2)文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。特别的是,文本文件是指以ASCII码方式(也称文本方式)存储文件,更准确地说,英文、数字等字符存储的是ASCII码,汉字存储的是机内码。换言之,文本文件除了存储文件有效字符信息(包括能用ASCII码字符表示的回车、换行等信息),无法存储其他任何信息。
(3)流式文件:所见即所得的编辑内容。eg:Word、TXT,代表流式软件有永中Office、微软Office、WPS等。
(4)资源文件(.rc文件是resource的简称),对应着VS中的资源视图文件;包括譬如对话框、菜单、图标、字符串、版本等资源信息。使用.rc资源文件的目的是为了对程序中用到的大量资源进行统一的管理。它的扩展名是.rc,在程序编译时它会被资源编译器编译生成一个.res的二进制文件。
2、链接(Link),指把多个OBJ目标文件、LIB库文件链接成一个可执行文件的过程。链接过程的输入是OBJ、LIB等库文件,输出是EXE、DLL等可执行文件。
PS:(1)静态链接lib库和lib导入库以及动态链接库dll的关系
1)静态lib:包含了所有的代码实现的,是源代码文件.c或.cpp文件编译而成的,这个lib库就是文本形式的源代码编译之后的二进制形式代码
2)lib导入库:只是dll文件中所有函数在dll文件中的地址说明
3)静态lib与lib导入库最后的命运殊途同归,在程序生成之后,就被抛弃了。
4)dll的使用还可以直接使用API函数来获取dll内部的函数地址,然后将函数类型转换为正确的函数类型,而这些函数类型的声明在提供的头文件中。头文件与我们自己写的头文件一样,这个过程非常麻烦,这就是lib导入库存在的空间。即dll的两种使用方式,①使用lib导入库,②使用API直接使用dll里面的函数
3、构建(build),指生成整个操作系统的过程。构建涵盖了对源代码的编译、对库文件的链接,还有可能包含映像文件打包等其他附加操作。在三个概念中,构建的范围是最大的。
二、ninja本身
ninja本身就是通过ninja编译出来的
编译过程
1、生成一个build.ninja
2、执行python3 configure.py --bootstrap之后编译源码,生成一个a.out
3、根据这个build.ninja重新编译生成可执行文件ninja
4、在ninja根据ninja.build来编译时会自动创建一个build目录用于存放编译过程中的临时文件。
三、ninja启动过程
1、处理参数
2、读取ninja文件并构建图
3、构建Edge图
4、加载日志文件
(1).ninja_log保存ninja运行期间的所有日志
(2).ninja_deps保存了ninja的构件图,在此过程将节点添加到构建图中,查找每个节点的最后记录记录输出,并计算开发记录的总数(使用ninja -t deps读取)
5、执行编译
四、总结
1、由其他高级编译系统生成其输入文件
(1)ninja自带ninja_syntax.py
(2)安卓soong编译系统中的工具
(3)cmake-Gninja生成ninja文件
2、更快的编译
(1)编译前会构建一张图
(2)根据图找到依赖关系链
(3)根据依赖关系链,展开编译命令,构建子进程进行编译以提高编译速度