前段时间编译了win版本,最近捣鼓一下Ubuntu版本。
配置网络,Ubuntu在网络配置填写了代理,在终端还是要输入
set http_proxy=xxxx:xx
set https_proxy=xxxx:xx
这样避免大部分的git代码下载
为了减少下载代码和避免git那个几G内存的坑,我直接将windows下的版本复制了一份,这也为后面埋下了坑。
根据文档需求,创建了这个文件夹结构,三个子文件夹automate, chromium_git, depot_tools和一个sh文件update.sh,一个py文件 Install-build-deps.py
/media/xxx/linux/code/ (后面简化为~/code方便阅读,实际上~/代表用户根目录,在这里~=/media/xxx/linux。)
automate/
automate-git.py <-- CEF build script
chromium_git/
update.sh <-- Bootstrap script for automate-git.py
depot_tools/ <-- Chromium build tools
Install-build-deps.py <—install deps
先拉automate-git.py,为了方便,我直接git先下一份cef,然后在cef/tools/automate文件夹找到它。将它复制到~/code/automate/下。
1. 安装python3等,下载install-build-deps.py(抄书)
cd ~/code
sudo apt-get install curl file lsb-release procps python3 python3-pip
curl 'https://chromium.googlesource.com/chromium/src/+/main/build/install-build-deps.py?format=TEXT' | base64 -d > install-build-deps.py
sudo python3 ./install-build-deps.py --no-arm --no-chromeos-fonts --no-nacl
python3 -m pip install dataclasses importlib_metadata
2.编写update.sh
#!/bin/bash
python3 ./automate/automate-git.py —download-dir=~/code/chromium_git —depot-tool-dir=~/code/depot_tools —no-distrib —no-build —branch=6045
运行update.sh之后就得到
chromium_git/
?? cef/
?? chromium/
?? ? ? ? cef/
3.在~/code/chromium_git目录下运行终端
export PATH=~/code/depot_tools:$PATH
set GN_DEFINES=is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome chrome_pgo_phase=0 use_thin_lto=false use_jumbo_build=true
set GN_ARGUMENTS=--ide=ninja --sln=cef --filters=//cef/*
python3 ./chromium/src/cef/tools/gclient_hook.py —depot-tool-dir=~/code/depot_tools
很快就在 ~/code/chromium_git/chromium/src/out 生成两个子文件夹 Release_GN_X64和Debug_GN_X64
一切看起来很顺利,不过一会就打脸了。
4.编译
export PATH=~/code/depot_tools:$PATH
cd ./chromium/src
Ninja -j8 -C out/Release_GN_X64
还没开始就结束,报错了,clang相关的库找不到。原因在上面有,指向的llvm-build下的windows版本的,根本不可能进行编译。直接删了,结果更快报错。于是相当了同步代码。在~/code/chromium_git/chromium下运行gclient sync,貌似会提示配置NO_AUTH_BOTO_CONFIG,什么鬼?这里同步就算不配置NO_AUTH_BOTO_CONFIG,命令行也没出现error字样的,但是中间会缺失很多文件。使用文档编辑器,写上类似
[Boto]
proxy = <代理服务器的地址>
proxy_port = <代理服务器的端口号>
proxy_user = <代理服务器的用户名>
proxy_pass = <代理服务器的密码>
有些没有proxy_user和proxy_pass的,可以不填。 然后保存到~/code/.boto。命令行走起:
export PATH=~/code/depot_tools:$PATH
export NO_AUTH_BOTO_CONFIG=~/code/.boto
cd ~/code/chromium_git/chromium
gclient sync -D
这样一波操作会清除windows下库,同时同步了linux的clang。查看一下~/code/chromium_git/chromium/src/third_party/llvm-build/Release+Asserts/bin/clang,如果不在,那就死磕它,继续gclient sync
完成之后重新开始,调到步骤1 。
编译中可能遇到的问题:
1 报X11问题,有人提及跳过编译client,但是我还是尝试安装一下xcb系列。
sudo apt install xcb libxcb-xkb-dev x11xkb-utils libx11-xcb-dev libxkbcommon-x11-dev
貌似安装之后不会提示X11/xxxx.h找不到之类的。
2 报vaapi的错,例如: error: no member named ‘subsampling_x’ in ‘__VAEncSequenceParameterBufferAV1….’ ,这google提到是libva的版本太低了。Ubuntu安装的libva-dev是1.14.0,我直接编译一份(2.21.0)
git clone https://github.com/intel/libva
./autogen.sh
./configure
make -j12
sudo make install
#1. GN构建
#手打的,注意检查一下,linux版本有提及use_sysroot=false,这个我没尝试。部分路径可能需要绝对路径,使用pwd查看并改进。
#!/bin/bash
export PATH={绝对路径}/depot:PATH
#这里很坑,用export就一直报错,改为set才行。
set GN_DEFINES=is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome chrome_pgo_phase=0 use_thin_lto=false
set GN_ARGUMENTS=--filters=//cef/*
python3 ./chromium/src/cef/tools/gclient_hook.py --depot-tools-dir=./depot_tools
#2.编译
#!/bin/bash
export PATH={绝对路径}/depot:PATH
#下面这些文件是我修改的,参考win版编译,其中autorename_libavcodec_hevcdec.c有点不同,需要自行打开vscode补全。
cp ./build_ffmpeg.py ./chromium/src/third_party/ffmpeg/chromium/scripts
cp ./autorename_libavcodec_hevcdec.c ./chromium/src/third_party/ffmpeg/libavcodec/
cp ./autorename_libavformat_hevc.c ./chromium/src/third_party/ffmpeg/libavformat/
cp ./ffmpeg_generated.gni ./chromium/src/third_party/ffmpeg/
cd ./chromium/src
#ninja -j8 -C out/Release_GN_x64 cef #会缺少chrome_sandbox
#ninja -j8 -C out/Debug_GN_x64 cef #会缺少chrome_sandbox
ninja -j8 -C out/Release_GN_x64 cefclient cefsimple ceftests chrome_sandbox
ninja -j8 -C out/Debug_GN_x64 cefclient cefsimple ceftests chrome_sandbox
其他的修改可以参考windows编译版本,有些可能配置的文件不一样,我建议只将增加autorename_libavcodec_hevcdec.c和autorename_libavformat_hevc.c到ffmpeg_c_sources下面,将编码相关的放前者,将格式的放后者。编译的时候可能会遇到某某函数找不到,那就用vscode将ffmpeg那个子目录拉进去,搜索一下就可以知道了,授之以鱼不然授之以渔?
有时候一个细节会挂系统,我之前编译一次,在ninja编译的时候没有加-j8,无限制编译模式,结果死机重启后就登录不了,黑屏,真服了。。。后来限制编译速度,不满核跑了。
稍微测了一下下,网上的视频没问题,本地的视频好像只播声音,有点奇怪。
cef_binary_119.4.7+g55e15c8+chromium-119.0.6045.199_docs.zip
链接:https://pan.baidu.com/s/1sRthOHBT4TQaZco58Id8xg?
提取码:ifiz?
cef_binary_119.4.7+g55e15c8+chromium-119.0.6045.199_linux64.zip
链接:https://pan.baidu.com/s/12m8rPSI0QefSk8WQCDPIsw?
提取码:gkkg?