Ninja工具介绍及基本语法

1. Ninja 简介

ninja是一个专注于速度的小型构件系统。是chromium的核心构建系统。小而美的构件系统,只需拷贝一个可执行程序ninja就可以执行,不需要依赖任何库。

1.1 获取源码

1.2 build & install

./configure.py --bootstrap
生成二进制文件 ninja, 直接拷贝到/usr/bin或者用的时候指定到环境变量。

参考README:
To build your own binary, on many platforms it should be sufficient to
just run ./configure.py --bootstrap; for more details see HACKING.md.
(Also read that before making changes to Ninja, as it has advice.)
Installation is not necessary because the only required file is the
resulting ninja binary. However, to enable features like Bash
completion and Emacs and Vim editing modes, some files in misc/ must be
copied to appropriate locations.

2. Ninja文件的基本语法

Ninja是一种类似GNU make的编译系统。 就像make有Makefile,它也有自己的编译配置文件。 相对来说,Ninja文件没有分支、循环的流程控制,本质上就是纯粹的配置文件,所以要比Makefile简单得多。

2.1 语法:创建一个 rule 和一个 build:

rule

由一个命令(command)和描述(description)参数(描述只是给人看的,所以你可以知道它在构建你的代码时在做什么)组成。规则为命令行声明一个简短的名称。他们由关键字rule和一个规则名称打头的行开始,然后紧跟着一组带缩进格式的 variable = value行组成。下面示例中声明了一个名为gn的rule.

build 的语法是 build output_file: rule_name input_files。

    1 ninja_required_version = 1.7.2
    2 
    3 rule gn
    4   command = ../../3rdparty/gn/out/Release/gn --root=../../3rdparty/chromium -q --script-executable=/usr/bin/python2 gen .
    5   description = Regenerating ninja files
    6 
    7 build build.ninja: gn
    8   generator = 1
    9   depfile = build.ninja.d
   10 
   11 pool build_toolchain_action_pool
   12   depth = 4
   13 
   14 pool build_toolchain_link_pool
   15   depth = 2
   16 
   17 subninja toolchain.ninja
   18 subninja host/toolchain.ninja
   19 
   20 build chromium_builder_asan: phony obj/chromium_builder_asan.stamp

build 构建语句

build语句声明输入和输出文件之间的一个关系。构建语句由关键字build开头,格式为build outputs: rulename inputs。这样的一个声明,所有的输出文件来源于(derived from)输入文件。当缺输出文件或输入文件变更时,Ninja将会运行此规则来重新生成输出。
一个构建语句,可以和rule一样,紧跟一组带缩进格式的key = value对。当在命令中变量执行时,这些变量将覆盖(shadow)任何变量。

3.使用

3.1 Gn 生成 ninja文件。

qtwebengine下,执行make命令自动调用gn生成.ninja

3.2 ninja 命令的使用

查看帮助 ninja -help

–version # 打印版本信息
-v # 显示构建中的所有命令行(这个对实际构建的命令核对非常有用)
-C DIR # 在执行操作之前,切换到DIR目录
-f FILE # 制定FILE为构建输入文件。默认文件为当前目录下的build.ninja。如 ./ninja -f demo.ninja
-j N # 并行执行 N 个作业。默认N=3(需要对应的CPU支持)。如 ./ninja -j 2 all
-k N # 持续构建直到N个作业失败为止。默认N=1
-l N # 如果平均负载大于N,不启动新的作业
-n # 排练(dry run)(不执行命令,视其成功执行。如 ./ninja -n -t clean)
-d MODE # 开启调试模式 (用 -d list 罗列所有的模式)
-t TOOL # 执行一个子工具(用 -t list 罗列所有子命令工具)。如 ./ninja -t query all
-w FLAG # 控制告警级别

ninja -t list相关,主要集成了graphviz等一些对开发非常有用的工具

ninja subtools:
browse # 在浏览器中浏览依赖关系图。(默认会在8080端口启动一个基于python的http服务)
clean # 清除构建生成的文件
commands # 罗列重新构建制定目标所需的所有命令
deps # 显示存储在deps日志中的依赖关系
graph # 为指定目标生成 graphviz dot 文件。如 ninja -t graph all |dot -Tpng -o graph.png
query # 显示一个路径的inputs/outputs
targets # 通过DAG中rule或depth罗列target
compdb # dump JSON兼容的数据库到标准输出
recompact # 重新紧凑化ninja内部数据结构

3.3 运行ninja进行源码编译。

qtwebengine下,执行make命令自动调用gn生成.ninja并执行 Makefile 语句 “ninja -v -C /opt/Qt5.15.0/Src/qtwebengine/src/core/release QtWebengineCore“-- 进入release目录下,执行build.ninja 生成 QtWebengineCore

[11404/19634] /usr/bin/g++ -MMD -MF obj/v8/v8_base_without_compiler/gdb-jit.o.d -DUSE_UDEV -DUSE_AURA=1 -DUSE_NSS_CERTS=1 -DUSE_OZONE=1 -DOFFICIAL_BUILD -DTOOLKIT_QT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DNO_UNWIND_TABLES -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -DNDEBUG -DNVALGRIND -DDYNAMIC_ANNOTATIONS_ENABLED=0 -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DENABLE_MINOR_MC -DV8_INTL_SUPPORT -DV8_CONCURRENT_MARKING -DV8_ENABLE_LAZY_SOURCE_POSITIONS -DV8_EMBEDDED_BUILTINS -DV8_WIN64_UNWINDING_INFO -DV8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -DV8_COMPRESS_POINTERS -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_DEPRECATION_WARNINGS -DV8_TARGET_ARCH_X64 -DV8_HAVE_TARGET_OS -DV8_TARGET_OS_LINUX -DDISABLE_UNTRUSTED_CODE_MITIGATIONS -DV8_COMPRESS_POINTERS -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_DEPRECATION_WARNINGS -DU_USING_ICU_NAMESPACE=0 -DU_ENABLE_DYLOAD=0 -DUSE_CHROMIUM_ICU=1 -DU_STATIC_IMPLEMENTATION -DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE -DUCHAR_TYPE=uint16_t -DV8_COMPRESS_POINTERS -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_DEPRECATION_WARNINGS -DUSE_SYSTEM_ZLIB=1 -Igen -I../../3rdparty/chromium -I../../3rdparty/chromium/v8 -Igen/v8 -Igen -I../../3rdparty/chromium/third_party/icu/source/common -I../../3rdparty/chromium/third_party/icu/source/i18n -I../../3rdparty/chromium/v8/include -fno-strict-aliasing --param=ssp-buffer-size=4 -fstack-protector -fno-unwind-tables -fno-asynchronous-unwind-tables -fPIC -pipe -pthread -m64 -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -Wno-unused-local-typedefs -Wno-maybe-uninitialized -Wno-deprecated-declarations -fno-delete-null-pointer-checks -Wno-comments -Wno-packed-not-aligned -Wno-dangling-else -Wno-missing-field-initializers -Wno-unused-parameter -fno-omit-frame-pointer -fvisibility=hidden -Wno-strict-overflow -Wno-return-type -O3 -fno-ident -fdata-sections -ffunction-sections -g0 -std=gnu++14 -Wno-narrowing -Wno-class-memaccess -Wno-attributes -Wno-class-memaccess -Wno-subobject-linkage -Wno-invalid-offsetof -Wno-return-type -Wno-deprecated-copy -fno-exceptions -fno-rtti -fvisibility-inlines-hidden -c ../../3rdparty/chromium/v8/src/diagnostics/gdb-jit.cc -o obj/v8/v8_base_without_compiler/gdb-jit.o
[11405/19634] /usr/bin/g++ -MMD -MF obj/v8/v8_base_without_compiler/deoptimizer.o.d -DUSE_UDEV -DUSE_AURA=1 -DUSE_NSS_CERTS=1 -DUSE_OZONE=1 -DOFFICIAL_BUILD -DTOOLKIT_QT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DNO_UNWIND_TABLES -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -DNDEBUG -DNVALGRIND -DDYNAMIC_ANNOTATIONS_ENABLED=0 -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DENABLE_MINOR_MC -DV8_INTL_SUPPORT -DV8_CONCURRENT_MARKING -DV8_ENABLE_LAZY_SOURCE_POSITIONS -DV8_EMBEDDED_BUILTINS -DV8_WIN64_UNWINDING_INFO -DV8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -DV8_COMPRESS_POINTERS -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_DEPRECATION_WARNINGS -DV8_TARGET_ARCH_X64 -DV8_HAVE_TARGET_OS -DV8_TARGET_OS_LINUX -DDISABLE_UNTRUSTED_CODE_MITIGATIONS -DV8_COMPRESS_POINTERS -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_DEPRECATION_WARNINGS -DU_USING_ICU_NAMESPACE=0 -DU_ENABLE_DYLOAD=0 -DUSE_CHROMIUM_ICU=1 -DU_STATIC_IMPLEMENTATION -DICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_FILE -DUCHAR_TYPE=uint16_t -DV8_COMPRESS_POINTERS -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_DEPRECATION_WARNINGS -DUSE_SYSTEM_ZLIB=1 -Igen -I../../3rdparty/chromium -I../../3rdparty/chromium/v8 -Igen/v8 -Igen -I../../3rdparty/chromium/third_party/icu/source/common -I../../3rdparty/chromium/third_party/icu/source/i18n -I../../3rdparty/chromium/v8/include -fno-strict-aliasing --param=ssp-buffer-size=4 -fstack-protector -fno-unwind-tables -fno-asynchronous-unwind-tables -fPIC -pipe -pthread -m64 -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -Wno-unused-local-typedefs -Wno-maybe-uninitialized -Wno-deprecated-declarations -fno-delete-null-pointer-checks -Wno-comments -Wno-packed-not-aligned -Wno-dangling-else -Wno-missing-field-initializers -Wno-unused-parameter -fno-omit-frame-pointer -fvisibility=hidden -Wno-strict-overflow -Wno-return-type -O3 -fno-ident -fdata-sections -ffunction-sections -g0 -std=gnu++14 -Wno-narrowing -Wno-class-memaccess -Wno-attributes -Wno-class-memaccess -Wno-subobject-linkage -Wno-invalid-offsetof -Wno-return-type -Wno-deprecated-copy -fno-exceptions -fno-rtti -fvisibility-inlines-hidden -c ../../3rdparty/chromium/v8/src/deoptimizer/deoptimizer.cc -o obj/v8/v8_base_without_compiler/deoptimizer.o

4. 信息补充

4.1. 环境变量

通过环境变量NINJA_STATUS可以控制ninja打印进度状态的样式,有几个占位符:

%s 起始edges的数量。
%t 完成构建必须运行的edges总数。
%p 起始edges的百分比。
%r 当前运行的edges数。
%u 要开始的剩余edges数。
%f 完成的edges数。
%o 每秒完成edges的总速率
%c 当前每秒完成edges的速率(由-j或其默认值指定的构建的平均值)
%e 经过的时间(以秒为单位)。(自Ninja 1.2起可用。)
%% 一个普通的%字符。
默认进度状态为"[%f/%t] “(请注意尾随空格以与构建规则分开)。可能的进度状态的另一个示例可能是”[%u/%r/%f] “。
尝试改为export NINJA_STATUS=”[%p/%f/%t %e] “(Windows下set NINJA_STATUS=”[%p/%f/%t %e] ")的效果如下:

4.2. Ninja构建日志.

Ninja构建日志保存在构建过程的根目录或.ninja文件中builddir变量对应的目录的.ninja_log文件中。
依次为:开始时间、结束时间、mtime、output文件路径名、命令行hash。

21438   21544   1605819583      gen/cc/cc_jumbo_21.cc   edb563b38373aae7
21537   21546   1606335686      obj/base/util/memory_pressure/memory_pressure.inputdeps.stamp   8eb0bc8731cecef3
21450   21605   1605819570      gen/cc/mojom/mojom_jumbo_1.cc   b94d30afb834cf4f
20905   21677   1606335686      obj/build/linux/libudev/udev1_loader/libudev1_loader.o  ae5d5458f2ff4bc
21460   22688   1605819712      gen/cc/mojom/touch_action.p     a3f161fbcc2dc174
21540   25810   1606335690      obj/base/base/base_jumbo_1.o    db1ef315e98c51fe

其中mtime是输入文件们的最后修改时间的时间戳算出来的值,经测试,开始时间、结束时间、命令行hash均不会影响增量的判定。

4.3. mtime检查文件测试

假设现在时间是2019-12-31 15:35:55,将输入.c文件修改时间改为之前的,不会触发重新编译;将输入.c文件修改时间改为未来的,每次都触发编译。

参考:

5. 问题总结

5.1 编译过程中莫名其妙就卡住,死机。

top命令查看实时资源消耗情况,发现cc1plus 起了6个线程,CPU总占用量达到95%以上,考虑降低线程数。 解决。

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值