Ubuntu22下源码编译CEF(branch=6045)+mp4+mp3笔记

前段时间编译了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才行。
#20240229 其实改set也是前面几个参数有效,貌似4个,多参数要用export,后面是“”括起来,在外面填好,在env后能显示完整才对。有些也很奇葩的,就是设置也无效,那就直接改相应的配置文件,例如use_thin_lto=false

#export GN_DEFINES="is_cfi=false is_official_build=true use_thin_lto=false proprietary_codecs=true ffmpeg_branding=Chrome chrome_pgo_phase=0 use_vaapi=false"     
#这是我后面放docker编译的配置,死活就没检查到use_thin_lto=false,后来直接改文件了,真气啊,没办法,摸着石头过河,我的桶没装多少水。

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 

===============================================================

后续:docker centos7 

原因:上面那个版本的libcef.so依赖GLIB2.35啊,我给卡脖子了。主要还是运维比较懒,docker pull debian都可以支持glibc2.36+了,xxxxxxx,算了,吐槽一下而已,问题还是要解决的。

根据install-build-deps.py和GPT和哥哥和度娘一系列操作下来,有一堆依赖可以装的(可能有多余)


yum install binutils-devel
yum install bison-devel
yum install bzip2-devel
yum install dbus-x11
yum install elfutils-devel
yum install flex-devel
yum install gperf
yum install glibc-devel
yum install libcap-devel
yum install libdrm-devel
yum install elfutils-libelf-devel
yum install libevdev-devel
yum install libffi-devel
yum install mesa-libgbm-devel
yum install glib2-devel
yum install spice-gtk3-devel
yum install krb5-devel
yum install pciutils-devel
yum install pulseaudio-libs-devel
yum install lksctp-tools-devel
yum install speech-dispatcher-devel
yum install sqlite-devel
yum install openssl-devel
yum install systemd-devel
yum install libgudev1-devel
yum install libva-devel
yum install perl-libwww-perl.noarch
yum install libxshmfence-devel
yum install libXtst-devel
yum install perl-DateTime-Locale.noarch  //locales
yum install patch
yum install perl
yum install rh-perl530-perl-ExtUtils-PkgConfig.noarch  //pkg-config
yum install rpm
yum install ruby
yum install subversion
yum install uuid-devel
yum install uuid-c++-devel
yum install diffutils    //wdiff
yum install xorg-x11-utils   //x11-utils
yum install xz-devel    //xz-utils
yum install libzip-devel
yum install cairo-devel
yum install fuse-devel //libfuse2 
yum install fuse3-devel //libfuse2 

yum install epel-release -y    //安装这个才能装下面的
yum install p7zip p7zip-plugins -y
yum groupinstall "X Window System" -y
yum install openbox tint2 lightdm -y
yum install xfce4-terminal firefox gedit tunar conky cjkumi-ukai-fonts -y
yum install cdbs.noarch
yum install devscripts
yum install dpkg-dev
yum install fakeroot
yum install brlapi-devel
yum install libcurl-devel
yum install lighttpd
yum install nss-devel

yum install alsa-lib-devel
yum install cups-devel
yum install libpam0g-dev
yum install libxslt-devel

wget https://mirror.tuna.tsinghua.edu.cn/centos/7/os/x86_64/Packages/libXt-1.1.5-3.el7.x86_64.rpm
rpm -ivh libXt-1.1.5-3.el7.x86_64.rpm

yum install xcompmgr

yum -y install libXScrnSaver
yum -y install liberation-fonts
yum install lsb -y
yum install pax*
yum install nss-*

和上面的步骤类似,不过我直接将代码docker cp过去,然后...

1.将src/build/linux/debian_bullseye_arm64-sysroot删了,将下载好的debian_bullseye_arm64-sysroot.tar.xz(https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain/4c00ba2ad61ca7cc39392f192aa39420e086777c/debian_bullseye_amd64_sysroot.tar.xz)放到src/build/linux/下,运行

tar -xf debian_bullseye_amd64-sysroot.tar.xz

2. 将src/third_party/llvm-build/Release+Asserts/下的内容清空,将下载好的clang-llvmorg-18-init-4631-gd50b56d1-1.tar.xz和llvmobjdump-llvmorg-18-init-4631-gd50b56d1-1.tar.xz放进该目录。

tar -xf clang-llvmorg-18-init-4631-gd50b56d1-1.tar.xz
tar -xf llvmobjdump-llvmorg-18-init-4631-gd50b56d1-1.tar.xz
echo "llvmorg-18-init-4631-gd50b56d1-1">cr_build_revision

这个是我的电脑更新的时候读取到的。如果不同的版本,好像直接读取cr_build_revision,然后到这里去查看相应的版本,下载clang和objdump。

3.安装一份gcc8+,我用的9.3.1

#直接安装全部,不管fortan还是plugin,懒得想那么多!
yum install devtoolset-9-gcc*

4.最麻烦的事情就是在docker centos7里啥版本都很低,有些要直接修改.ninja文件,将“-I/usr/include”改为“-I../../build/linux/debian_bullseye_amd64-sysroot/usr/include”,将“-l$:libffi_pic.a”改为“../../build/linux/debian_bullseye_amd64-sysroot/usr/lib/x86_64-linux-gnu/libffi_pic.a”,还有在debug模式编译的时候死活过不了,原来有函数在release使用,在debug模式不用,例如“kBitsPerPkey”这个参数,还有附近还有两个函数,需要vim修改一下,将它们包含在编译宏里面。林林总总,很多个文件,我直接在ubuntu上一一对应改好,然后传到docker里面覆盖(docker下的vim不好用,有些ninja文件压根就没法拉到最底的,可能是单行的字符数太多了吧)。

最后提一句,还是不要用centos做docker,累人啊,直接换debian,轻松还长发。

2024-03-07 docker问题更新

更新chrome代码时候会遇到'....Command ('lsb_release','-a')' returned non-zero exit status 1.

我是使用ubuntu作为镜像的时候遇到的,很奇怪,死活过不了,后来不知道哪个高手提到将lsb_release改名的高招,然后顺利更新代码了。centos和debian默认不安装lsb_release,所以没遇上,哈哈。。。

2024-03-11 问题更新

关于use_sysroot=true和false的一些奇怪现象,在docker+ubutnu20+use_sysroot=true镜像中很轻松就编译出来,在本地系统ubuntu22写true就会失败,去掉则可以成功,但是编译有时候会出来超级大的文件,有时候会正常,具体原因未知。

2024-03-13 跟进

如果默认不填symbol_level,得到可能是一个非常大的libcef.so,如果symbol_level=0得到300m+;如果symbol_level=1得到1G+。11号那个问题大概是symbol_level导致的。按这样的估计,symbol_level<=1会轻松点,如果不填,debug模式可能无法出来(我试过libcef.so.xxxx的临时文件是8.9G,但是bash闪退了)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值