-- Ubuntu 下编译 WebRTC
Ubuntu 下编译 WebRTC
一、Ubuntu 系统环境准备
1、安装双系统 Windows 10 / Ubuntu 16.04
最近几年一直在使用 ThinkPad 笔记本(自己之前自己买的 ThinkPad X230),现在公司给配的 ThinkPad X1,已经好久不安装双系统了(Windows & Ubuntu,一直以 VMware 虚拟机代替),目前根据公司任务,有时需要从事 Windows 开发,有时也要从事 Android 底层 native 的开发,同事们都是使用 MAC 进行 Android 进行开发,唯独我自己使用 Windows 系统,经常出现协同开发时遇到一些系统级的坑,如 Android.mk 文件中源码文件路径过长, 编译脚本下载到 Windows 下自动转换为 Windows 格式,导致脚本不能执行,git 过滤文件格式 .ignore 不生效等问题;让我慢慢下定决心转到 Ubuntu 下进行发开发 Android。最近公司决定基于 webrtc 进行二次开发,为了方便快速的将 webrtc 源码进行下载和编译,决定首先在 Ubuntu 下进行编译。
公司配的 X1 磁盘空间剩余不多,决定使用 X230 分配出200个 G 进行安装 Windows 10 / Ubuntu 双系统,安装过程中也遇到了一些新的问题(主要是由于 X230 双磁盘,固态硬盘 & 机械硬盘,安装成功后总是不能引导 Ubuntu 启动),最终搞了将近 3 个小时才搞明白,其实安装很简单,步骤如下:
a、Windows 下使用 UltraISO 刻录 Ubuntu 系统镜像
ubuntu 建议下载 64bit 的,目前电脑内存都是大于 4G 的,如果装了 32 bit,那么大的内存就太浪费了;
b、安装 Ubuntu 时 系统引导盘选择整个的 机械硬盘,即 Ubuntu 系统安装所在磁盘
本人 Windows 10 安装在了 SSD 固态硬盘上,而 Ubuntu 安装在了 500G 的机械硬盘上,如果需要启动 Ubuntu 系统,需要在电脑启动时,按 F12 选择系统引导磁盘,默认还是固态硬盘,如要启动 Ubuntu,就选择机械硬盘,既可(也可以在 bois 表中,配置 BOOT 启动项顺序,调整此次启动磁盘)。
c、准备 Ubuntu 的环境
- 搞定 VPN,可翻墙快速访问 Google 服务器(搞不定,就结束吧)
- 安装 gcc、g++
- 安装 git
- 安装完整版的 vim,Ubuntu 默认是阉割版的 VI ,安装完成后,执行 alias vi=vim
- 安装 ssh (可选,方便远程连接,如果不想不断的操作两个电脑的话)
- 安装 nethogs,可用于按照进行查看网络流量信息(可选)
- 安装 iptraf,可用于按照 连接/端口查看网络流量信息(用起来相对 nethogs 复杂些,可选)
- 最好安装中文输入法(系统使用 English,但如果打算长期使用 Ubuntu 开发的话,中文输入法还是必不可少的。
以上选项网上搜索均可搞定;
二、下载 WebRTC 源码及依赖工具
1、下载 depot_tools 并配置
Google 使用 depot_tools 工具(脚本组合)进行代码的同步、下载管理等,这个脚本包中包含了 gclient、gcl、git-cl,repo 等;
在 Linux 下需首先确认 git 和 Python 已经安装,并且 git version >= 2.2.1, Python version = 2.7(版本过高会报错);
选择一个目录,如
~/OpenSource
通过 git 获取 depot_tools ,执行如下命令既可:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
最后将 depot_tools 目录添加到环境变量 PATH 中,建议添加到 ~/.bashrc 中,或者 /etc/profile 文件中,可以一劳永逸,打开以上中的任意一个文件,如
sudo vi ~/.bashrc
在最后添加一行:
export PATH=~/OpenSource/depot_tools:"$PATH"
执行命令,使环境变量生效:
source ~/.bashrc
可通过
echo $PATH
确认配置成功:
/home/gobert/OpenSource/depot_tools:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
执行以下命令,安装并配置 depot_tools 依赖:
gclient sync
需要等待一段时间,具体看你的 VPN 网速如何了。
三、下载并编译 WebRTC
1、下载 WebRTC 源码
mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc
gclient sync
经过漫长的等待, webrtc 全部下载到本地的话,大约会占用 6.4 G 的磁盘空间;
-
可选项:指定如何跟踪处理新的分支
git config branch.autosetupmerge always
git config branch.autosetuprebase always
git config branch.autosetupmerge always
表示 自动从远程分支合并提交到本地分支,如果不做此设置,你需要手动 merge;
git config branch.autosetuprebase always
设置在执行 git pull 命令时做 rebase 而不是是 merge;可选的值还有 never:不自动 rebase, local 跟踪本地分支进行 rebase, remote 跟踪远程分支进行 rebase, always 所有跟踪的分支都自动进行 rebase;
-
可选项:创建一个新的本地分支
cd src
git checkout master
git new-branch your-branch-name
建议创建下新的本地开发分支,如: git new-branch dev
-
编译前更新下最新代码
git pull
注:如果在上一步中,没有创建新的分支,则使用
git fetch
命令代替,以获取最新代码。
注:由于WebRTC 目前还在频繁的更新中,建议定期的去下载更新下编译工具链及其依赖,通过执行
gclient sync 既可!
2、编译
WebRTC 目前使用 GN 来生成构建脚本,Ninja 进行构建,所以系统平台均是。
-
生成 Ninja 工程文件
Ninja 工程文件由 GN 生成,为其选择一个放置的目录中,如 out/Debug 或者 out/Release,这里官方建议选择 out/Default 这样可以放置 debug 和 release,在 src 目录下还行一下命令,默认生成 debug 版本的构建文件:
gn gen out/Default
如果 提示 gn 命令 not found,需检查 depot_tools 环境变量设置是否生效。
执行以下命令生成 Ninja 工程文件
gn gen out/Default
如果需要生成 release 工程文件,需在后面加上关闭 debug 的参数 --args=is_debug= false
如果需要清理 Ninja 工程文件,但保持 GN 环境配置不变的话,可以执行以下命令:
gn clean out/Default
-
Ninja 编译
ninja -C out/Default
总共有 3600 多个文件需要一一编译,编译成功后,会在 out/Default 目录下生成大量的可执行测试程序:
activity_metric g722_test neteq_opus_quality_test rtc_event_log2rtp_dump toolchain.ninja
args.gn gen neteq_pcmu_quality_test rtc_media_unittests tools_unittests
audio_codec_speed_tests genmacro neteq_rtpplay rtc_pc_unittests transient_suppression_test
audio_decoder_unittests genmodule neteq_speed_test rtc_stats_unittests turnserver
audio_device_tests genperf nonlinear_beamformer_test rtc_unittests unpack_aecdump
audioproc_f genstring obj rtp_analyze video_capture_tests
build.ninja genversion ortc_unittests rtp_analyzer.py video_engine_tests
build.ninja.d ilbc_test pb_parse.py rtp_analyzer.sh video_loopback
bwe_simulations_tests insert_packet_with_timing peerconnection_client rtpcat voe_auto_test
click_annotate isac_api_test peerconnection_server RTPchange voice_engine_unittests
common_audio_unittests isac_fix_test peerconnection_unittests RTPencode webrtc_nonparallel_tests
common_video_unittests isac_switch_samprate_test plot_videoprocessor_integrationtest RTPjitter webrtc_opus_fec_test
conversational_speech_generator isac_test protoc RTPtimeshift webrtc_perf_tests
delay_test low_bandwidth_audio_test psnr_ssim_analyzer screenshare_loopback webrtc_tests
event_log_visualizer misc.py pyproto stun_prober yasm
force_mic_volume_max modules_tests py_quality_assessment stunserver
frame_analyzer modules_unittests re2c system_wrappers_unittests
frame_editor neteq_ilbc_quality_test relayserver test_packet_masks_metrics
g711_test neteq_isac_quality_test rgba_to_i420_converter test_support_unittests
四、问题记录
1、gn: command not found 或者 gclient command not found 是因为 depot_tools 环境变量配置有误,没有正确找到 depot_tools 目录下的 gn 或 gclient 工具,确认 ~/.bashrc 文件配置是否正确:
export PATH=~/OpenSource/depot_tools:"$PATH"
2、执行 gn gen out/Default 命令报错:
gn.py: Could not find gn executable at: XXX/gn
需要执行命令:
gclient runhooks
需要耐心等待一段时间,由其自动下载安装一些工具包,完成后,再次执行
gn gen out/Default
命令,提示成功:
Done. Made 467 targets from 126 files in 383ms