前言
用了2天半时间,在linux下编译了一次chrmomium工程.
中间有些官方文档上没有的补充操作.
不管编译哪个平台版本的chromium工程, 都强烈的感到自己的开发机太渣了:)
试验
官方文档
https://chromium.googlesource.com/chromium/src/+/master/docs/linux_build_instructions.md
chromium工程在linux下的编译,没有好的非官方编译资料。也许我做的这个试验算一个.
编译过程主要看官方文档,遇到编译不过的地方去google.
安装环境要求
官方推荐ubuntu14.2 + 64bits + 8GB memory, 我选择了当前较新的ubuntu18.04.
下载OS安装介质
ubuntu-18.04-desktop-amd64.iso
安装虚拟机
应该在linxu真机上做试验. 在真机中,从官方下载代码的速度比虚拟机中快10倍。如果在虚拟机中下载工程代码,因为超时问题,起始代码都下载不完。
没有符合条件的linux真机,装个ubuntu18.04虚拟机来完成编译chromium的任务. 起始代码我用在win10中下载的原始代码不runhooks的版本。如果用runhooks执行后的代码,有win版的依赖性,在linux下就编译不过了。具体操作见下面的试验描述。
虚拟机配置, 8GB memory + 2*2 cpu + 200GB硬盘空间
虚拟机配置完后,先不安装OS, 将已经配置好的硬盘删了,再加一块200GB硬盘, 将磁盘空间预先分配好,将磁盘文件存为一个完整的文件,用来提高虚拟机的性能.
ubuntu18.04安装选项 = 正常安装 + 联网更新软件.
选择中文语言
安装完,将所有能更新的软件在更新管理器里面都更新掉。
准备编译环境
在真机上准备好小梯子, 虚拟机装好,默认是NAT上网. 这时, 虚拟机里面的ubuntu18.04可以正常访问外网。
开启root用户
安装ubuntu18.04后,root用户是没开启的。
配置编译环境,编译chromium时,需要root身份或 sudo
所以启用root用户,修改root口令。
sudo passwd root
sudo passwd -u root
切到root用户
su - root
安装vmtools
按照vmware的提示,将光盘中的tar文件拷贝到/home/dev, 解开,运行那个.pl就行。
修改分辨率
分辨率默认是800x600, 屏幕太小了,打开个对话框,都看不到确定按钮:)
xrandr
cvt 1280 800
xrandr --output Virtual1 --mode "1280x800"
这种方法改分辨率是暂时的,重启计算机后,还要重新设置一次。
修改dns
显示应用程序 - 全部 - 设置 - 网络 => 将dhcp改为手工, 填写参数位192.168.180.139, 255.255.255.0, 192.168.180.2, 将DNS设置位8.8.8.8,8.8.4.4, 只包留ipv4, 禁止ipv6
ping www.baidu.com
ping www.google.com
这时,应该能ping的通,才往下走。
准备试验目录
切到root用户
mkdir /home/dev
chmod 777 /home/dev
# /home/dev 是做实验的目录
cd /home/dev
安装网络工具
这时ifconfig还没有呢
apt install net-tools
安装git
官方工具下载代码要用git
apt install git
配置git
因为是第一次使用git, 要配置一下
git config --global user.name "my name"
git config --global user.email "[email protected]"
git config --global core.autocrlf false
git config --global core.filemode false
git config --global branch.autosetuprebase always
安装python
官方工具下载代码,编译工程都要用python
apt install python
下载官方工具
cd /home/dev
ping chromium.googlesource.com
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
如果卡住进度不动,CTRL+C杀掉进程,重新来。
将官方工具加入环境变量
cp ~/.bashrc ~/.bashrc.bk
vi ~/.bashrc
# add /home/dev/depot_tools to PATH
export PATH="$PATH:/home/dev/depot_tools"
关掉控制台,新开一个控制台,切到root用户.
echo $PATH
可以看到depot_tools的全路径,已经在PATH中.
建立工程目录
cd /home/dev
mkdir ./chromium && cd ./chromium
下载代码
fetch –nohooks chromium
虽然真机上的外网环境很好,但是经过虚拟机转发了一道后,性能下降的很厉害。
真机中ping www.google.com是50ms, 在虚拟机中ping www.google.com是300ms~700ms.
这步由于在虚拟机中完成,导致了fetch超时报错. 代码下载的速度太慢(等了一夜,都没下载多少KB…)或根本下载不了(超时)。
最后想了一个笨招, 我已经编译过win版的chrome了,再重新在win10下,运行了一次fetch –nohooks chromium, 可以得到未经任何修改的原始代码。用7zip软件tar好后,经过vmware共享文件夹(/mnt/hgfs/chromium/)拷贝到/home/dev/,然后再tar出来。
解压win10下tar好的压缩包
ls@ubuntu18:/home/dev/chromium$ cp /mnt/hgfs/chromium/*.tar.* .
/mnt/hgfs/chromium/*.tar.* 是win10下的7zip分卷压缩的
cat chromium.tar.* | tar -xv
ls@ubuntu18:/home/dev/chromium$ ls -a
. chromium_dl_ok.tar.007 chromium_dl_ok.tar.015 chromium_dl_ok.tar.023 chromium_dl_ok.tar.031
.. chromium_dl_ok.tar.008 chromium_dl_ok.tar.016 chromium_dl_ok.tar.024 .gclient
chromium_dl_ok.tar.001 chromium_dl_ok.tar.009 chromium_dl_ok.tar.017 chromium_dl_ok.tar.025 .gclient_entries
chromium_dl_ok.tar.002 chromium_dl_ok.tar.010 chromium_dl_ok.tar.018 chromium_dl_ok.tar.026 src
chromium_dl_ok.tar.003 chromium_dl_ok.tar.011 chromium_dl_ok.tar.019 chromium_dl_ok.tar.027
chromium_dl_ok.tar.004 chromium_dl_ok.tar.012 chromium_dl_ok.tar.020 chromium_dl_ok.tar.028
chromium_dl_ok.tar.005 chromium_dl_ok.tar.013 chromium_dl_ok.tar.021 chromium_dl_ok.tar.029
chromium_dl_ok.tar.006 chromium_dl_ok.tar.014 chromium_dl_ok.tar.022 chromium_dl_ok.tar.030
这个笨招的效果和在linux中直接执行 fetch –nohooks chromium 效果是一样的
下载完成后,也是得到一下2个gclient配置文件和一个工程源码目录.
.gclient
.gclient_entries
src
用这个原始代码,来产生linux版工程和编译linux版工程,最后的结果是正常的。
这个笨招,让我想了好久.
下载工具链
cd /home/dev/chromium
gclient runhooks
这时,要从官网的代码服务器和第三方的服务器下载需要的工具链软件和依赖软件,这必须要在虚拟机中下载了(和真实的linux编译环境有关)。好在这步的下载是有重试功能的,只要外网连接正常,下的慢点也能下载完,要下载的流量也没有那么大,好像有1,2GB.
编译前再次同步代码
gclient sync
这步会将再次校验源码的完整性(如果官方代码有更新或代码没下全,会重新去下载增量部分)和runhooks(校验和更新工具链和第三方软件)。
产生工程文件
gn gen out/Default
这步报错了
ls@ubuntu18:/home/dev/chromium/src$ gn gen out/Default
ERROR at //build/config/linux/pkg_config.gni:103:17: Script returned non-zero exit code.
pkgresult = exec_script(pkg_config_script, args, "value")
^----------
Current dir: /home/dev/chromium/src/out/Default/
Command: python -- /home/dev/chromium/src/build/config/linux/pkg-config.py -s /home/dev/chromium/src/build/linux/debian_sid_amd64-sysroot -a x64 pangocairo -v freetype
Returned 1.
stderr:
Traceback (most recent call last):
File "/home/dev/chromium/src/build/config/linux/pkg-config.py", line 232, in <module>
sys.exit(main())
File "/home/dev/chromium/src/build/config/linux/pkg-config.py", line 139, in main
prefix = GetPkgConfigPrefixToStrip(options, args)
File "/home/dev/chromium/src/build/config/linux/pkg-config.py", line 80, in GetPkgConfigPrefixToStrip
"--variable=prefix"] + args, env=os.environ)
File "/usr/lib/python2.7/subprocess.py", line 216, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 394, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1047, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
See //build/config/linux/pangocairo/BUILD.gn:9:3: whence it was called.
pkg_config("pangocairo") {
^-------------------------
See //ui/base/BUILD.gn:974:18: which caused the file to be included.
configs += [ "//build/config/linux/pangocairo" ]
^--------------------------------
查资料得知,需要安装以下组件。
sudo apt install libpango1.0-dev
sudo apt install libcogl-pango-dev
sudo apt install libjpeg-dev
现在工程文件生成成功
开始编译工程
cd /home/dev/chromium/src
ninja -C out/Default chrome // first time
看着编译开始,很happy, 去睡觉去了
解决编译报错问题
早上起来,看到编译报错停了…
ninja: Entering directory `out/Default'
[4426/35533] ACTION //third_party/blink/renderer/core:make_core_generated_bison(//build/toolchain/linux:clang_x64)
FAILED: gen/third_party/blink/renderer/core/xpath_grammar.cc gen/third_party/blink/renderer/core/xpath_grammar.h
python ../../third_party/blink/renderer/build/scripts/rule_bison.py ../../third_party/blink/renderer/core/xml/xpath_grammar.y gen/third_party/blink/renderer/core bison
Traceback (most recent call last):
File "../../third_party/blink/renderer/build/scripts/rule_bison.py", line 83, in <module>
returnCode = subprocess.call([bisonExe, '-d', '-p', prefix, inputFile, '-o', outputCpp])
File "/usr/lib/python2.7/subprocess.py", line 172, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 394, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1047, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
[4431/35533] ACTION //third_party/angle/third_party/vulkan-valida...unique_objects_wrappers_helper(//build/toolchain/linux:clang_x64)
ninja: build stopped: subcommand failed.
解决报错问题
根据报错提示,知道是ubuntu18.04默认安装时,没有bison。
sudo apt install flex
sudo apt install bison
which flex /*Sanity check to make sure flex is installed*/
which bison /*Sanity check to make sure bison is installed*/
继续解决报错问题
[536/31103] ACTION //third_party/blink/renderer/core:make_core_generated_css_value_keywords(//build/toolchain/linux:clang_x64)
FAILED: gen/third_party/blink/renderer/core/css_value_keywords.cc gen/third_party/blink/renderer/core/css_value_keywords.h
python ../../third_party/blink/renderer/build/scripts/core/css/make_css_value_keywords.py ../../third_party/blink/renderer/core/css/CSSValueKeywords.json5 ../../third_party/blink/renderer/core/css/SVGCSSValueKeywords.json5 --output_dir gen/third_party/blink/renderer/core --gperf gperf
Traceback (most recent call last):
File "../../third_party/blink/renderer/build/scripts/core/css/make_css_value_keywords.py", line 75, in <module>
json5_generator.Maker(CSSValueKeywordsWriter).main()
File "../../third_party/blink/renderer/build/scripts/core/css/../../json5_generator.py", line 274, in main
writer.write_files(args.output_dir)
File "../../third_party/blink/renderer/build/scripts/core/css/../../json5_generator.py", line 242, in write_files
self._write_file_if_changed(output_dir, generator(), file_name)
File "../../third_party/blink/renderer/build/scripts/core/css/../../gperf.py", line 62, in generator_internal
return generate_gperf(gperf_path, gperf_input, gperf_args)
File "../../third_party/blink/renderer/build/scripts/core/css/../../gperf.py", line 45, in generate_gperf
127, gperf_args, output='Command not found.')
subprocess.CalledProcessError: Command '['--key-positions=*', '-P', '-n', '-m', '50', '-D', '-Q', 'CSSValueStringPool']' returned non-zero exit status 127
ninja: build stopped: subcommand failed.
开始没看出是啥组件没装, 先装些系统软件试试
sudo apt-get update
sudo apt-get install autoconf
sudo apt-get install libjson-perl
sudo apt-get install emboss bioperl ncbi-blast+ gzip libjson-perl libtext-csv-perl libfile-slurp-perl liblwp-protocol-https-perl libwww-perl
sudo apt install json
which json
还是同样的报错
最后装了gperf正常了
sudo apt install gperf
继续编译
cd /home/dev/chromium
gclient sync
gn gen out/Default
cd /home/dev/chromium/src
autoninja -C out/Default chrome // second time
编译成功
开始还是担心中间会由于哪个组件没安装,导致编译报错。索性就看着编译完成。从早上8点,编译到晚上7点,终于编译完。
尝试运行编译后输出文件
ls@ubuntu18:/home/dev/chromium/src$ ./out/Default/chrome
可以看到chromium已经起来了,编译成功。
后续的问题
编译完成后,看了一下/home/dev/chromium/src/out/Default中的输出文件,发现有几百MB一个的可执行文件,这么大个?
去查了一下,是编译选项带调式符号和调试等级引起的问题,如果去掉调试符号的release版,编译后的输出文件(chromium + all so + all rc)打包后,才40MB.
找到的控制编译后size的资料, 产生编译配置时,要去掉调试符号, build 后的 size 就下来了。
https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/GaIYIzq6NGM
https://groups.google.com/a/chromium.org/forum/#!msg/chromium-dev/AZZ04wssLoY/I2i53jg-CAAJ
官方gn手册
产生工程文件是由gn产生的,控制gn的命令行,可以去掉调试符号。
https://www.chromium.org/developers/gn-build-configuration
现在没有高性能linux真机,编译的太慢了,没有继续再试验.
编译过程真受不了,编译一次10几个小时.