环境:虚拟机64位Ubuntu 20.04
前提:需要有一个可以用的代理(非常重要,没有代理几乎无法下载完整的WebRTC代码

一、环境配置

WebRTC中文网有提供国内的WebRTC镜像,但目前WebRTC依赖的第三方库在国内镜像源里还未提供,因此需要配置环境代理,这是我的代理设置:

export https_proxy=http://127.0.0.1:41091 http_proxy=http://127.0.0.1:41091 all_proxy=socks5://127.0.0.1:1090

这相当于临时设置的环境变量,只在当前打开的控制台窗口有效。当然也可以全局设置代理,应用到整个系统:

#打开bashrc文件:
sudo vim ~/.bashrc
#写入:
export https_proxy=http://127.0.0.1:41091
export http_proxy=http://127.0.0.1:41091
export all_proxy=socks5://127.0.0.1:1090
#执行:
source ~/.bashrc

二、安装depot_tools

depot_tools是个工具包,里面包含gclient、gcl、gn和ninja等工具,这些根据都是使用python写的。其主要的功能是对git的增强,让代码管理和编译更加简单。WebRTC就是通过depot_tools工具进行版本管理的,因此首先要下载depot_tools工具:

#自己是在/home/rtc目录下安装depot_tools,也可以选其他目录
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

https://chromium.googlesource.com/是谷歌的镜像源,没有代理几乎是连接不上的

成功下载后要设置环境变量,由于之后WebRTC的代码都需要通过depot_tools管理,因此可以设置成全局变量:

vim ~/.bashrc
# .bashrc添加如下一行
export PATH="$PATH:/home/rtc/depot_tools"
source ~/.bashrc

注意:在拉取WebRTC代码时同时会下载WebRTC源码、编译依赖的资源文件,同时会更新depot_tool中的cipd工具链本身,但镜像包只能镜像git仓库,编译依赖的资源文件依然需要使用depot_tool里面的cipd下载,所以还得再执行下一步的设置:

  1. 禁用cipd工具更新:
export DEPOT_TOOLS_UPDATE=0
  1. 设置下载工具代理
vim .boto
#在.boto文件中输入一下内容保存
[Boto]
proxy = 127.0.0.1
proxy_port = 1090
  1. 设置环境变量指向前面文件
export NO_AUTH_BOTO_CONFIG=/home/rtc/.boto

三、获取代码

mkdir webrtc
cd webrtc
#获取代码
fetch --nohooks webrtc
#用于中断后继续下载
gclient sync

一般fetch --nohooks命令下载的WebRTC代码都不完全,即使通过国内的镜像源下载,也是会出现部分依赖无法下载的情况。我在电脑上下载的时候,都是出现第三方库依赖无法下载的问题,以下是获取源码过程中的部分信息打印:

Sat Aug  7 01:26:00 CST 2021
Running depot tools as root is sad.
WARNING: Your metrics.cfg file was invalid or nonexistent. A new one will be created.
1>________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://webrtc.bj2.agoralab.co/webrtc-mirror/src.git /home/rtc/webrtc/_gclient_src_hHgNXk' in '/home/rtc/webrtc'
1>Cloning into '/home/rtc/webrtc/_gclient_src_hHgNXk'...
1>remote: Enumerating objects: 353190, done.
1>remote: Counting objects: 100% (353190/353190), done.
1>remote: Compressing objects: 100% (75706/75706), done.
1>remote: Total 353190 (delta 267568), reused 353022 (delta 267465)
1>Receiving objects: 100% (353190/353190), 269.76 MiB | 12.24 MiB/s, done.
1>Resolving deltas: 100% (267568/267568), done.
Syncing projects:   2% ( 1/40) src
[0:03:55] Still working on:
[0:03:55]   src/base
[0:03:55]   src/build
[0:03:55]   src/buildtools
[0:03:55]   src/testing
[0:03:55]   src/third_party
[0:03:55]   src/tools
7>WARNING: subprocess '"git" "-c" "core.deltaBaseCacheLimit=2g" "clone" "--no-checkout" "--progress" "https://webrtc.bj2.agoralab.co/webrtc-mirror/chromium/src/tools" "/home/rtc/webrtc/src/_gclient_tools_uqClZk"' in /home/rtc/webrtc failed; will retry after a short nap...

[0:04:05] Still working on:
[0:04:05]   src/base
[0:04:05]   src/build
[0:04:05]   src/buildtools
[0:04:05]   src/testing
[0:04:05]   src/third_party
[0:04:05]   src/tools

#...省略大部分打印
[0:13:36] Still working on:
[0:13:36]   src/third_party
[0:13:36]   src/tools
 
[0:13:46] Still working on:
[0:13:46]   src/third_party
[0:13:46]   src/tools

#最后的打印结果
File “/home/rtc/depot_tools/gclient_utils.py”, line 983, in run
self.item.run(*self.args, **self.kwargs)
File “/home/rtc/depot_tools/gclient.py”, line 933, in run
file_list)
File “/home/rtc/depot_tools/gclient_scm.py”, line 132, in RunCommand
return getattr(self, command)(options, args, file_list)
File “/home/rtc/home/rtc/depot_tools/gclient_scm.py”, line 553, in update
self._Clone(revision, url, options)
File “/home/rtc/depot_tools/gclient_scm.py”, line 1060, in _Clone
if os.listdir(tmp_dir):
OSError: [Errno 2] No such file or directory: ‘/home/rtc/webrtc/src/_gclient_third_party_cBey1o’

在我的电脑上,最后打印的结果说明第三方依赖库third_party下载失败,从一直刷这些日志可以看出:

[0:13:46] Still working on:
[0:13:46]   src/third_party
[0:13:46]   src/tools

为了下载完整的WebRTC代码,需要在执行fetch --nohooks命令后再执行:

gclient sync
#或者
gclient sync --nohooks --no-history #重复拉取不会多次下载同样代码

我一般是用gclient sync。其中hooks就是那些在Git执行特定事件(如commit、push、receive等)后触发运行的脚本,具体可见https://blog.csdn.net/weixin_30693683/article/details/98416829

四、安装依赖

在下载完整的WebRTC代码后,就需要安装依赖。这一步也是需要连接代理:

cd /home/rtc/webrtc/src
./build/install-build-deps.sh

五、生成Ninja工程文件

WebRTC默认使用Ninja作为编译系统,Ninja工程文件通过GN生成。
使用如下命令生成默认配置工程(Debug编译,工程文件位于out\Default目录下):

gn gen out/Default
#或者参数详细点,不过gn工具也可以获取这些信息
gn gen out/Default --args='target_os="linux" target_cpu="arm64"'

如果需要Release编译,通过如下命令生成工程文件:

gn gen out/Default --args='is_debug=false'

需要说明的是,ubuntu 20.04版本python2与python3都有安装,默认python命令使用的是python2,但是电脑上用python2的话会出现各种神奇的错误,因此我默认是用python3来执行

六、编译

ninja -C out/Default

最后在src/out/Default/obj可以看到生成的静态库文件:libwebrtc.a。

七、代码更新

后续如需要更新代码,按照如下步骤执行即可:

git checkout master
git pull origin master
gclient sync

参考

  1. Linux平台WebRTC编译
  2. WebRTC 源码国内镜像
  3. linux配置webRTC环境问题(1)
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐