赞
踩
前段时间编译了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闪退了)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。