ninja是一个专注于速度的小型构件系统。是chromium的核心构建系统。小而美的构件系统,只需拷贝一个可执行程序ninja就可以执行,不需要依赖任何库。
./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.
Ninja是一种类似GNU make的编译系统。 就像make有Makefile,它也有自己的编译配置文件。 相对来说,Ninja文件没有分支、循环的流程控制,本质上就是纯粹的配置文件,所以要比Makefile简单得多。
由一个命令(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 outputs: rulename inputs。这样的一个声明,所有的输出文件来源于(derived from)输入文件。当缺输出文件或输入文件变更时,Ninja将会运行此规则来重新生成输出。
一个构建语句,可以和rule一样,紧跟一组带缩进格式的key = value对。当在命令中变量执行时,这些变量将覆盖(shadow)任何变量。
qtwebengine下,执行make命令自动调用gn生成.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内部数据结构
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
通过环境变量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] ")的效果如下:
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均不会影响增量的判定。
假设现在时间是2019-12-31 15:35:55,将输入.c文件修改时间改为之前的,不会触发重新编译;将输入.c文件修改时间改为未来的,每次都触发编译。
参考:
top命令查看实时资源消耗情况,发现cc1plus 起了6个线程,CPU总占用量达到95%以上,考虑降低线程数。 解决。