WebRTC已经开源五周年了, 其鼎鼎大名, 在实时多媒体通讯领域无出其右. 学习应用WebRTC的热潮, 从未衰退过. 国内的很多公司的多媒体通讯产品, 都基于WebRTC构建. 要理解借鉴WebRTC中的算法或实现, 虽然未必需要了解其如何编译, 但是掌握WebRTC编译系统运作机制, 对于理解应用, 助益颇多, 庖丁解牛,恢恢乎游刃有余, 此之谓也.
WebRTC的编译系统是使用了GYP和Ninja的混合系统, 本文无意全面介绍WebRTC的编译及其机制, 仅仅希望以介绍Ninja编译系统为入口, 管中窥豹, 一探WebRTC之编译的鳞爪.
什么是Ninja: Ninja是一个编译系统, 与其它编译系统相比,其最大的不同是:Ninja的最大目标是为了加快编译速度. 现在很多项目都规模庞大, 源代码需要支持跨平台,由多种开发语言构成, 几十万,几百万甚至更多的代码构成一个项目, 编译时间多的需要几个小时或更长, 冗长的编译已经开发人员的恶梦. Ninja 就是应此而生.
Ninja诞生于Chromium项目,它是Google的Chromium工程师为了编译代码而设计的工具, Chromium的源代码超过30000个文件, 其编译非常复杂. Ninja最初设计目的就是为了简化Chromium的编译,现在Ninja又被用来编译Google的另一个开源项目WebRTC而受到关注. 虽然目前Ninja还不是开源项目编译系统的主流选择, 但是相比于现在应用广泛的automake/autoconfig, Ninja的优势可谓非常明显, Ninja的编译速度占优, 而且Ninja所产生的编译文件的可读性也更好, automake和autoconfig生成的configure和Makefile, 已经超过了人类可以理解的底线. 相比于CMake和GYP系统, Ninja 在支持的features上有不足, 也许未来Ninja可以和CMake或者GYP互为补充, 共同为一个大规模项目编译做支持.
1. Ninja 的安装
Linux:
Debian/Ubuntu: apt-get install ninja-build
MAC: 需要安装homebrew或者MacPorts
brew install ninja 或者 port install ninja
也可以在这里下载: https://github.com/ninja-build/ninja/releases
2. Ninja 的使用
Ninja的命令行格式如下:
ninja [options] [targets...]
常用的options:
-C DIR -- 指定工作路径
-f FILE -- 指定输入编译文件, 如未指定,则在工作路径选择build.ninja文作为输入, 找不到输入文件将汇报错误
-t TOOL -- 运行子工具集中的工具, Example: ninja -C DIR -t clean
-j N -- 并行运行N个任务, 这个跟make的参数意义一样, 默认的N是CPU核心数量
待续: 下文将讲述Ninja的语法
Reference:
1. https://ninja-build.org/ Nanja的官方主页
2 https://github.com/ninja-build/ninja Nanjia的源代码