1.编译总览

 前面成功的编译了v8,采用的命令是

tools/dev/gm.py x64.release.check

它实际执行了以下几层:

  • 1.启动构建,写args.gn配置文件
  • 2.gn调用配置文件生成ninjs配置文件
  • 3.ninja读取上一步生成的配置文件并执行
  • 4.根据ninja执行对应的编译命令

具体的命令如下:
1.新建目录

mkdir -p out/x64.release

2.写入gn配置

echo>out/x64.release/args.gn<<eof
...
...
...
eof

3.调用gn命令生成ninja文件

gn gen out/x64.release

4.autonija生成最终ninja执行命令

autonija -c out/x64.release d8

5.根据ninja文件调用编译命令编译生成d8

depot_tools/ninja -c out/x64.release d8 -j 3

2.编译工具

会发现上面出现了gn,ninja等构建工具,gn是v8的元构建工具,ninja是v8的构建工具,也就是说gn读取参数生成ninja配置文件,ninja再读区配置文件生成编译命令,之所以不直接编译是因为对于大型项目需要考虑不同的平台的兼容性,因此单独写编译配置文件工程量巨大,在这个基础上再给构建工具来抽象一层会大大简化这个工程量,接着就来介绍gn与ninja的使用

2.1 元构建工具gn

因为前面已经成功的编译好了v8,所以depot_tools中已经包含了gn,可以直接在命令行中运行,它实际会去调用/depot_tools/gn.py,gn常用的命令如下:

gn help//展示gn工具的帮助信息

gn args//一是生成.ninja构建配置文件,二是查看当前构建环境的配置参数

gn gen <out_dir>//根据当前的代码树及配置,产生ninja文件,并把它们放在给定的目录下

gn clean//对历史构建进行清理

gn desc//显示关于一个给定target或config的信息

gn ls//展示给定构建目录下,匹配某个模式的所有targets

gn path//查找两个taregets之间的依赖路径

gn refs//查找反向的依赖(也就是引用了某些东西的targets)


https://sq.163yun.com/blog/ar...

2.2 构建工具ninja

ninja的配置文件分为2部分,rule和文件依赖关系,具体语法如下:

①变量(全局/自定义),变量名=字符串 
cflags = -Wall

②规则(单个或多个命令) 
//`声明了一个名为cc的rule,连同一个待运行的命令`
rule cc
  command = gcc $cflags -c $in -o $out

③构建(构建的动作),build 名称 规则 输入 输出
//`build outputs: rulename inputs`
build foo.o: cc foo.c
  --version  # 打印版本信息(如当前版本是1.5.1)
  -C DIR   # 在执行操作之前,切换到`DIR`目录
  -f FILE  # 制定`FILE`为构建输入文件。默认文件为`build.ninja`。
  -j N     # 并行执行 N 个作业。默认N=3(需要对应的CPU支持)。
  -l N     # 如果平均负载大于N,不启动新的作业
  -k N     # 持续构建直到N个作业失败为止。默认N=1
  -n       # 排练(dry run)(不执行命令,视其成功执行。
  -v       # 显示构建中的所有命令行
  -d MODE  # 开启调试模式 (用 -d list 罗列所有的模式)
  -t TOOL  # 执行一个子工具(用 -t list 罗列所有子命令工具)。

旧城
94 声望6 粉丝

每行代码都产生价值。