Step into Chromium (0) - 源码编译
前言
玩玩 Chromium Native 开发呗?第一步当然是编译一个纯净的 Chromium 啦!
本文主要记录在我的环境上如何干净的构建它。限制点:
- 非默认的 Visual Studio 安装位置
- 连续磁盘空间不足 200 GB
- 不污染环境变量
系统环境准备
硬件和系统要求并不低,可以参考我的配置:
- 系统:Windows 11 (AMD64)
- CPU: Intel Core i7-12700H
- 内存:DDR5 32GB
在该笔记本上完整编译一次需要 7 小时以上。
重要
你还需要一个稳定的可以访问 google source 的网络环境,至少 80GB 的流量开销。
工具链和基建设施准备
Visual Studio (下称VS) 安装和配置
Chromium 的工程化比较完善,工具链和依赖以 depot_tools 仓库的形式维护。但是在获取这个仓库之前,你还应该安装 Visual Studio 2022,以及下列包:


注意
随 Chromium 版本升级,源文档中对于 Windows SDK 的小版本号会逐渐变大,如果你发现当前找不到这么新的 Windows SDK,请升级 VS 主版本。
安装好以后,到应用中找到 Windows SDK,修改:



Git & Depot Tools
在等待上面步骤完成的过程中,我们还可以安装并配置 git:
$ git config --global user.name "My Name"
$ git config --global user.email "my-name@chromium.org"
$ git config --global core.autocrlf false
$ git config --global core.filemode false
$ git config --global core.preloadindex true
$ git config --global core.fscache true
$ git config --global branch.autosetuprebase always
然后在一个至少有 90GB 空间的分区上新建一个文件夹并进入,克隆 depot_tools 仓库:
$ mkdir chromium && cd chromium
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
完成后,使用喜欢的编辑器写一个环境设置脚本:
pushd %~dp0
set PATH=%cd%\depot_tools;%PATH%
set DEPOT_TOOLS_WIN_TOOLCHAIN=0
call "D:\VisualStudio\IDE\Common7\Tools\VsDevCmd.bat"
set vs2022_install=D:\VisualStudio\IDE
cmd /k
重要
为了不污染环境变量,我们使用脚本定义这些环境变量,其仅在当前命令提示符及其子进程中生效。
这也要求后面我们的所有操作都在这样的命令提示符上运行。
相关信息
注意高亮的行,这是非默认 VS 组件安装路径的解法,前一个是调用了 Developer Command Prompt 来设置正确的环境变量,后者是手动指定了 VS 的安装目录,与 VS Installer 中的设置对应:

读者可参照修改。如果你按照默认的设置安装 VS,应该不太需要这两行。
此后,启动这个 env.bat
, 运行
$ gclient
,这会正确安装 python 和其他工具 在 depot_tools 内。
克隆源码
就在刚刚启动的 env.bat
环境中,执行
$ fetch chromium
这将一次性下载 chromium 主仓库,以及 200+ 个子仓库和配套工具(runhooks)。
好消息是,当主仓库拉取完成后,我们将可以中断这个过程,并通过
$ gclient sync
恢复。
提示
如果你中断后再恢复出现了 git conflict, 不要惊慌,进入对应的子仓库中执行
$ git reset --hard HEAD
此后重试。
当你成功完成了源码克隆,将得到一个 src 文件夹包含了所有的源码。
编译
Chromium 使用 GN 系统构建。 GN,即 Generate Ninja
,是一个用于将 GN DSL 转换成 Ninja 构建配置文件的系统,支持灵活的模板配置和依赖管理。
进入 src
目录,执行:
$ gn gen --ide=vs2022 --filters=//chrome --no-deps out\Default --args="is_component_build = true is_debug = true"
这将在 out\Default
生成构建配置。需要注意的是,由于 Chromium 的构建配置假定输出目录是 out\<Name>
,实际上使用了很多 ..\..\
这样的相对路径来访问到源码,所以务必保证目录结构如预期,否则编译失败。
在其他磁盘上存储构建产物
针对我这样的磁盘空间不足的用户打造,或者 CI 环境,我们可以将 out
目录重定向到其他磁盘。
这里的重定向不能够使用软链接/Junction,其在解析上级目录的时候会遇到问题。
解法是使用 NTFS 挂载点,如果有条件,可以在磁盘上划分一个足够大的分区并挂载上,或者像我一样使用 VHD。
PS: 使用 VHD 还可以后面利用分层特性整点活?
此后就可以进行编译了。运行:
ninja -C out\Default chrome -j <n>
其中 <n>
为你期望的并行进程数。综合你的物理线程数和内存大小考量即可,我选用 12
。
加快编译
在编译大型项目的时候,Windows Defender 的实时扫描会严重影响速度。建议关闭/加白相应文件夹处理。
剩下一个字,等!
运行测试
在经历了漫长的编译后,我们将会得到编译产物。这时候就可以在 out\Default
里面找到 chrome.exe
,蓝色图标的。打开它,看一下 about://version
:

Clangd 配置
为了后面能好好编写代码,我们还需要配置好 clangd,并从构建中提取构建命令。
$ python3 tools\clang\scripts\generate_compdb.py -p out\Default -o compile_commands.json chrome
此后打开一个源文件,等待 clangd 构建索引(可能需要几天时间)。
调试配置
如果你完全按照上面进行了编译,应该可以在 out\Default
中找到一个 1 KB 大小的 all.sln
文件,双击打开它。
然后按图中说明操作,转到项目->属性,配置属性->配置,取消勾选“生成”:

强推扩展 Microsoft Child Process Debugging Power Tool 2022


随后点击“调试”按钮,尝试下断点,应该好了。
