chromium官网
https://www.chromium.org/developers/
https://www.chromium.org/developers/how-tos/get-the-code
安装depot_tools
这个工具是谷歌用来下载同步和管理其软件项目的工具,包括chromium。
cd /home/xxx
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
然后depot_tools的bin目录放到PATH环境变量中,也就是在当前用户的根目录下,打开 ~/.bashrc ,在最后面写入
export PATH="$PATH:${HOME}/depot_tools"
然后回到目录中,执行
cd /home/xxx
source ~/.bashrc
获取源码
创建一个你放源码的文件
cd /home/xxx/workspace
mkdir ~/chromium && cd ~/chromium
然后用fetch工具来获取源码,fetch工具是depot_tools中的工具
fetch --nohooks --no-history chromium
注意事项:
- fetch代码时不能断点续传, 如果操作中断必须删掉整个文件夹重新fetch,建议传入
--nohooks
,在fetch完成后手动使用gclient运行Hook, 防止不必要的意外 - fetch代码时如果有翻阅Commit记录的需求, 不要传入
--no-history
- fetch完Chromium的主代码文件后,建议运行
gclient sync
同步一次源并执行一下各个Hook (这些Hook帮你下载第三方库然后配置好编译环境) 确保没有遗漏任何东西参数
更新代码
gclient sync
注意事项:
- 使用
gclient sync
时可以加入--no_bootstrap
选项来加快启动速度(避免从Google更新一次) - 使用
gclient sync
时如果你不在chromium的最新master分支, 需要带上--with_branch_heads --with_tags
参数来确保切换到了正确的地方
下载依赖
我们下载下来的源码中,有个src目录,进去之后执行
cd src
./build/install-build-deps.sh
编译chromium
首先执行
gclient runhooks
下载hook并执行,完成之后,执行下面的命令即可
cd src
gn gen out/Default
# 这一步大概等待10s-60s左右
# 输出"Done. Made 17662 targets from 3219 files in 17656ms"
autoninja -C out/Default chrome
# 初次编译,这一步大约需要十几个小时
编译完成之后,进入到out/Default目录即可。可以看见名为chrome的可执行文件。
注意事项:
- 改过 BUILD.gn 后不一定要重新执行
gn gen
, 这会造成IDE需要重新加载整个解决方案. 你可以直接运行一下 autoninja 让它重新生成ninja文件然后在编译前 Ctrl+C 就可以仅在IDE里重载一个项目
配置
如果你想编译时加入各种Codec的支持, 务必添加以下参数:
ffmpeg_branding = "Chrome"
proprietary_codecs = true
rtc_use_lto = true
rtc_use_h264 = true
use_openh264 = true
enable_hevc_demuxing = true
enable_ac3_eac3_audio_demuxing = true
enable_mse_mpeg2ts_stream_parser = true
Debug参数(加速编译):
is_debug = true
is_win_fastlink = true
is_component_build = true
blink_symbol_level = 0
Release参数(运行优化):
is_debug = false
is_win_fastlink = true
is_component_build = false
optimize_webui = true
symbol_level = 0
blink_symbol_level = 0
异常处理
异常1
1>WARNING: subprocess '"git" "-c" "core.deltaBaseCacheLimit=2g" "fetch" "origin" "refs/heads/main:refs/remotes/origin/main" "--no-tags" "--depth=1"' in /home/fuqiang/workspace/chromium1/src failed; will retry after a short nap...
解决方案:
等待一段时间,看会不会多次重复出现,我出现了4次后不在出现
异常2
fuqiang@ubuntu:~/workspace/chromium1/src$ autoninja -C out/Default chrome
ninja: Entering directory `out/Default'
[1875/56539] ACTION //components/resources:about_credits(//build/toolchain/linux:clang_x64)
FAILED: gen/components/resources/about_credits.html
python3 ../../tools/licenses/licenses.py --target-os=linux --depfile gen/components/resources/about_credits.d credits gen/components/resources/about_credits.html
Traceback (most recent call last):
File "../../tools/licenses/licenses.py", line 36, in <module>
from spdx_writer import SpdxWriter
File "/home/fuqiang/workspace/chromium1/src/tools/licenses/spdx_writer.py", line 6, in <module>
import dataclasses
ModuleNotFoundError: No module named 'dataclasses'
[1878/56539] CXX obj/third_party/angle/angle_common/aligned_memory.o
ninja: build stopped: subcommand failed.
解决方案:
更新python版本,重新编译
sudo apt install -y python3.7-dev
注意上面用的是python3,通过
python3 --version
看看是否更新成功,如果没有成功,可能是某些软链接没有修改
fuqiang@ubuntu:~/workspace$ ls -al /usr/bin/python*
lrwxrwxrwx 1 root root 18 Feb 16 16:57 /usr/bin/python -> /usr/bin/python3.7
lrwxrwxrwx 1 root root 9 Apr 16 2018 /usr/bin/python2 -> python2.7
-rwxr-xr-x 1 root root 3628904 Nov 29 02:51 /usr/bin/python2.7
-rwxr-xr-x 1 root root 154 Nov 11 2017 /usr/bin/python2-pbr
lrwxrwxrwx 1 root root 18 Feb 16 16:59 /usr/bin/python3 -> /usr/bin/python3.7
-rwxr-xr-x 2 root root 4526456 Nov 25 22:10 /usr/bin/python3.6
lrwxrwxrwx 1 root root 33 Nov 25 22:10 /usr/bin/python3.6-config -> x86_64-linux-gnu-python3.6-config
-rwxr-xr-x 2 root root 4526456 Nov 25 22:10 /usr/bin/python3.6m
lrwxrwxrwx 1 root root 34 Nov 25 22:10 /usr/bin/python3.6m-config -> x86_64-linux-gnu-python3.6m-config
-rwxr-xr-x 2 root root 4852896 Dec 10 2021 /usr/bin/python3.7
lrwxrwxrwx 1 root root 33 Dec 10 2021 /usr/bin/python3.7-config -> x86_64-linux-gnu-python3.7-config
-rwxr-xr-x 2 root root 4852896 Dec 10 2021 /usr/bin/python3.7m
lrwxrwxrwx 1 root root 34 Dec 10 2021 /usr/bin/python3.7m-config -> x86_64-linux-gnu-python3.7m-config
-rwxr-xr-x 1 root root 5183008 Dec 10 2021 /usr/bin/python3.8
lrwxrwxrwx 1 root root 33 Dec 10 2021 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config
lrwxrwxrwx 1 root root 16 Oct 25 2018 /usr/bin/python3-config -> python3.6-config
-rwxr-xr-x 1 root root 398 Nov 16 2017 /usr/bin/python3-jsonschema
lrwxrwxrwx 1 root root 10 Oct 12 16:04 /usr/bin/python3m -> python3.6m
lrwxrwxrwx 1 root root 17 Oct 25 2018 /usr/bin/python3m-config -> python3.6m-config
-rwxr-xr-x 1 root root 683 Apr 28 2017 /usr/bin/python3-petname
-rwxr-xr-x 1 root root 1797 Jul 12 2017 /usr/bin/python3-unidiff
fuqiang@ubuntu:~/workspace$
异常3
import bind_gen
File "/home/fuqiang/workspace/chromium1/src/third_party/blink/renderer/bindings/scripts/bind_gen/__init__.py", line 36, in <module>
from .callback_function import generate_callback_functions
File "/home/fuqiang/workspace/chromium1/src/third_party/blink/renderer/bindings/scripts/bind_gen/callback_function.py", line 8, in <module>
from .blink_v8_bridge import blink_class_name
File "/home/fuqiang/workspace/chromium1/src/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py", line 8, in <module>
from .code_node import FormatNode
File "/home/fuqiang/workspace/chromium1/src/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py", line 13, in <module>
from .mako_renderer import MakoRenderer
File "/home/fuqiang/workspace/chromium1/src/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py", line 7, in <module>
import mako.runtime
File "/home/fuqiang/workspace/chromium1/src/third_party/mako/mako/mako/runtime.py", line 14, in <module>
from mako import compat
File "/home/fuqiang/workspace/chromium1/src/third_party/mako/mako/mako/compat.py", line 68, in <module>
import importlib_metadata # noqa
ModuleNotFoundError: No module named 'importlib_metadata'
[4400/51900] ACTION //third_party/blink/rendere...lue_keywords(//build/toolchain/linux:clang_x64)
ninja: build stopped: subcommand failed.
解决方案:
sudo pip3 install importlib-metadata