WebRTC现在使用 gn 来生成构建脚本,使用 ninja 来构建。
gn 比 GYP 快多了,太多,你还没眨个眼,就结束了。
我们来大概介绍下编译 WebRTC 会用到的 gn 和 ninja 相关的知识。 想看编译指南的,看这里:Ubuntu 14.04下编译WebRTC。
gn
gn 的介绍在这里:GN build configuration。这个页面还有到 gn 各种 reference 的链接。
使用 gn 生成 ninja 构建文件的常用命令:
// 生成 debug 版本的构建文件,默认配置 gn gen out/Debug // 生成 release 版本的构建文件 gn gen out/Release --args="is_debug=false"
注意,通过 --args 可以传递参数给 gn ,具体参数的含义,由 WebRTC 的构建系统来解释。比如 is_debug 选项,决定构建 debug 还是 release 版本。
如果有多个参数,可以这样传递:
gn gen out/Release --args="is_debug=false proprietary_codecs=true"
通过--args指定多个参数时,参数之间用空格分隔。生成的参数,存放在 out/Release 下的 args.gn 文件中。你可以直接打开该文件查看。
通过--args 指定的参数,会覆盖 WebRTC 构建系统中同名参数。
gn 支持为 WebRTC 生成针对某个 IDE 的工程文件,通过 --ide 来指定。具体支持哪些 IDE ,可以使用下列命令查看:
gn gen --help
写作本文时,支持:
- eclipse, Eclipse CDT settings file
- vs, Visual Studio project/solution files.(default to VS 2015)
- vs2013
- vs2015
- xcode
- qtcreator, QtCreator project files.
- json
比如下列命令,生成支持 QtCreator 的项目文件:
gn gen out/Release --args="is_debug=false" --ide="qtcreator"
我喜欢 Qt ,所以以它为例了。再多说一句,生成的 QtCreator 项目文件在 out/Release/qtcreator_project 下面,只要打开 QtCreator ,加载 all.creator 文件即可。
如果你已经使用 gn gen 生成过构建文件,想看看这个版本的构建文件都指定了什么参数,可以使用下面命令:
gn args out/Release --list
它会列出所有的 build arguments 和对应的文档,以及当前值。
如果你想查看某个参数,可以使用下面的命令:
gn args out/Release --list="is_debug"
好啦, gn 就介绍到这里,如果想了解更多,可以看下面的链接:
- GN build configuration
- https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs
- https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/quick_start.md
- https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/reference.md
或者,执行下面的某个命令:
// 显示 gn 支持的所有命令行选项,比如 --args,-v gn help switches // 你可是对上面命令列出的每个 switch 使用 help 指令, // 比如 gn help --args, // 可以显示 --args 这个 switch 的详细帮助信息 gn help --args // 显示 gn gen 的帮助信息,比如 IDE 选项 gn gen --help
ninja
记得我在编译 Skia 时介绍过 ninja ,那篇文章在这里:Skia构建系统与编译脚本分析_foruok的博客-CSDN博客。
ninja 的官网在这里:Ninja, a small build system with a focus on speed。
后缀为 ninja(*.ninja) 的文件是 ninja 的 构建文件。对 WebRTC 来讲,执行完 gn gen 之后,会在 out/Release 下生成 build.ninja 文件,可以把这个文件看做是整个 WebRTC 的“ Makefile ”。它里面调用了各个模块的 ninja 文件。
要完整编译 WebRTC ,只要在 src 目录执行下列命令:
ninja -C out/Release
-C 选项告诉 ninja ,进入 out/Release 目录来编译。所以,它等同于:
cd out/Release ninja
要编译某个模块,可以在 ninja 命令后跟模块名字(build.ninja文件中定义的构建目标,就像 Makefile 中的构建目标一样)。比如:
// 构建 webrtc/pc ninja pc // 构建 webrtc/media ninja media
使用下列命令可以查看帮助:
ninja --help
ninja 支持子工具,比如 clean ,用来清理一次构建。用法如下:
ninja -t clean
如果要清理某个模块,可以这样:
ninja -t clean pc
更多子工具,可以这样看到:
ninja -t list
就先这样吧,下次写写 gn 的项目文件,再下次写写 ninja 文件。
参考文章: