爱分享

构建适用于 Windows 的 Chromium

奶瓶 · 7月8日 · 2021年 25次已读

有从获取代码页链接的其他平台的说明 。

系统要求

  • 具有至少 8GB RAM 的 64 位 Intel 机器。强烈建议超过 16GB。
  • NTFS 格式的硬盘驱动器上至少有 100GB 的可用磁盘空间。FAT32 将不起作用,因为某些 Git 包文件大于 4GB。
  • 适当版本的 Visual Studio,如下所述。
  • Windows 10 或更新版本。

设置 Windows

视觉工作室

Chromium 需要 Visual Studio 2017 (>=15.7.2) 才能构建,但首选 VS2019 (>=16.0.0)。Visual Studio 也可用于调试 Chromium,VS2019 是首选,因为它可以更好地处理 Chromium 的大量调试信息。使用了 clang-cl 编译器,但需要 Visual Studio 的头文件、库和一些工具。如果 Visual Studio Community Edition 的许可证适合你,它应该可以工作。您必须安装“使用 C++ 进行桌面开发”组件和“MFC/ATL 支持”子组件。这可以通过将这些参数传递给 Visual Studio 安装程序从命令行完成(有关 ARM64 说明,请参见下文):

$ PATH_TO_INSTALLER.EXE ^
--添加 Microsoft.VisualStudio.Workload.NativeDesktop ^
--添加 Microsoft.VisualStudio.Component.VC.ATLMFC ^
--包括推荐

如果要为 ARM64 Win32 构建,则需要一些额外的参数。该案例的完整设置是:

$ PATH_TO_INSTALLER.EXE ^
--添加 Microsoft.VisualStudio.Workload.NativeDesktop ^
--添加 Microsoft.VisualStudio.Component.VC.ATLMFC ^
--添加 Microsoft.VisualStudio.Component.VC.Tools.ARM64 ^
--添加 Microsoft.VisualStudio.Component.VC.MFC.ARM64 ^
--包括推荐

您必须安装 10.0.19041 或更高版本的 Windows 10 SDK。这可以单独安装,也可以通过选中 Visual Studio 安装程序中的相应框来安装。

还必须安装 SDK 调试工具。如果 Windows 10 SDK 是通过 Visual Studio 安装程序安装的,则可以通过以下方式安装它们:控制面板 → 程序 → 程序和功能 → 选择“Windows 软件开发工具包” → 更改 → 更改 → 选中“Windows 调试工具” ” → 改变。或者,您可以下载独立的 SDK 安装程序并使用它来安装调试工具。

安装 depot_tools

下载depot_tools 包 并将其解压缩到某处。

*** 注意 警告: 不要使用资源管理器中的拖放或复制粘贴提取,这不会提取隐藏的“.git”文件夹,这是 depot_tools 自动更新自身所必需的。不过,您可以使用上下文菜单中的“全部提取...”。


将 depot_tools 添加到 PATH 的开头(必须在任何 Python 安装之前)。假设您将包解压到 C:\src\depot_tools,打开:

控制面板 → 系统和安全 → 系统 → 高级系统设置

如果您具有管理员访问权限,请修改 PATH 系统变量并将其放在C:\src\depot_tools前面(或至少放在可能已经有 Python 或 Git 副本的任何目录的前面)。

如果您没有管理员权限,您可以添加一个用户级别的 PATH 环境变量并放在C:\src\depot_tools前面,但是如果您的系统 PATH 中有 Python,您将不走运。

此外,以相同的方式添加 DEPOT_TOOLS_WIN_TOOLCHAIN 系统变量,并将其设置为 0。这告诉 depot_tools 使用本地安装的 Visual Studio 版本(默认情况下,depot_tools 将尝试使用谷歌内部版本)。

您可能还需要将变量vs2017_install或设置vs2019_install为 Visual Studio 2017 或 19 的安装路径,例如 set vs2019_install=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional Visual Studio 2019。

从 cmd.exe shell,运行命令 gclient(不带参数)。首次运行时,gclient 将安装使用代码所需的所有特定于 Windows 的位,包括 msysgit 和 python。

  • 如果您从非 cmd shell(例如,cygwin、PowerShell)运行 gclient,它可能看起来运行正常,但 msysgit、python 和其他工具可能无法正确安装。
  • 如果您在第一次运行 gclient 时看到文件系统出现奇怪的错误,您可能需要禁用 Windows 索引

检查python安装

运行 gclient 后,打开命令提示符并键入where python并确认 depot_toolspython.bat位于 python.exe 的任何副本之前。在使用 gn 时未能确保这一点可能会导致过度构建 - 请参阅crbug.com/611087

App Execution Aliases 可能与系统上的其他 python 安装冲突,因此通过打开控制面板的“App execution aliases”部分并取消选中这两个旁边的框来禁用“python.exe”和“python3.exe”到“应用程序安装程序”。

获取代码

首先,配置 Git:

$ git config --global user.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 branch.autosetuprebase 总是

chromium为结帐创建一个目录并更改为它(您可以随意调用它并将其放在任何您喜欢的位置,只要完整路径没有空格):

$ mkdir 铬&&  cd铬

运行该fetch工具depot_tools以检查代码及其依赖项。

$ 获取铬

如果您不想要完整的 repo 历史记录,可以通过将--no-history标志添加到fetch.

预计命令即使在快速连接上也需要 30 分钟,而在较慢的连接上则需要数小时。

fetch完成时,它会创建一个隐藏的.gclient文件和一个名为目录src在工作目录。其余说明假设您已切换到src目录:

$ cd src

可选:如果您希望您的构建与某些 Google 服务通信,您也可以安装 API 密钥,但这对于大多数开发和测试目的来说不是必需的。

设置构建

Chromium 使用Ninja作为其主要构建工具以及一个名为GN的工具 来生成.ninja文件。您可以 使用不同的配置创建任意数量的构建目录。要创建构建目录:

$ gn 输出/默认
  • 您只需为每个新构建目录运行一次,Ninja 将根据需要更新构建文件。
  • 您可以Default用另一个名称替换,但它应该是out.
  • 对于其他构建参数,包括发布设置或使用 Visual Studio 的替代版本,请参阅GN 构建配置。默认将是与当前主机操作系统和 CPU 匹配的调试组件构建。
  • 有关 GN 的更多信息,请gn help在命令行上运行或阅读快速入门指南

更快的构建

  • 通过从防病毒和索引软件中排除构建目录来减少文件系统开销。
  • 将构建树存储在快速磁盘(最好是 SSD)上。
  • 内核越多越好(20+ 并不过分)并且需要大量 RAM(64 GB 并不过分)。

有一些 gn 标志可以提高构建速度。您可以在创建输出目录 ( gn args out/Default) 或 gn gen 命令行 ( gn gen out/Default --args="is_component_build = true is_debug = true")时出现的编辑器中指定这些。一些可以考虑使用的有用设置包括:

  • is_component_build = true - 这使用更多、更小的 DLL 和增量链接。
  • enable_nacl = false - 这会禁用本地构建通常不需要的 Native Client。
  • target_cpu = "x86"- x86 构建比 x64 构建稍快,并支持更多目标的增量链接。请注意,如果您设置了此项但未设置 enable_nacl = false,则构建时间可能会变得更糟。
  • blink_symbol_level = 0 - 关闭闪烁的源代码级调试以减少构建时间,如果您不打算调试闪烁,则适用。

为了加速链接,您可以设置symbol_level = 1或 symbol_level = 0- 这些选项减少编译器和链接器必须做的工作。随着symbol_level = 1该编译器生成的文件名和行号信息,所以你仍然可以做源代码级调试,但不会有局部变量或类型的信息。与symbol_level = 0没有源代码级调试,但调用堆栈仍然有函数名。更改 symbol_level需要重新编译所有内容。

此外,谷歌员工应该使用分布式编译系统 goma。详细信息在内部可用,但相关的 gn arg 是:

  • use_goma = true

要从 goma 中获得任何好处,重要的是将一个大的 -j 值传递给 ninja。一个好的默认值是 10*numCores 到 20*numCores。如果您运行 autoninja,那么它会自动将适当的 -j 值传递给 ninja 是否为 goma。

$ autoninja -C out \默认镀铬

调用 ninja 时,指定 'chrome' 作为目标以避免构建所有测试二进制文件。

尽管如此,在许多机器上构建仍需要很多小时。

使用 SCCACHE

您可以通过启用以下参数来将sccache用于构建过程:

  • cc_wrapper = "sccache"- 假设sccache二进制文件在你的%PATH%
  • chrome_pgo_phase = 0

为什么我的构建速度很慢?

许多事情会使构建变慢,Windows Defender 减慢进程启动是一个常见的罪魁祸首。您是否确保将整个 Chromium src 目录排除在防病毒扫描之外(在 Google 机器上,这意味着将其放在src驱动器根目录中的目录中)?您是否尝试过上面列出的不同设置,包括不同的链接设置和 -j 值?您是否在chromium-dev 邮件列表中询问过您的构建是否比机器规格的预期慢?

下一步是收集一些数据。如果您将NINJA_SUMMARIZE_BUILD 环境变量设置为 1,autoninja则会做三件事。首先,它将设置NINJA_STATUS 环境变量,以便 ninja 在构建 Chrome 时打印附加信息。它将显示在任何给定时间有多少构建进程正在运行、已完成多少构建步骤、每秒完成了多少构建步骤以及构建已运行多长时间,如下所示:

$设置NINJA_SUMMARIZE_BUILD=1
$ autoninja -C out \默认基础
忍者:进入目录`出\ d EFAULT '
 [1个过程,86/86 @ 2.7 / S:31.785s] LINK(DLL)base.dll base.dll.lib base.dll.pdb

这使得缓慢的进程创建立即变得明显,并让您快速判断构建是否比正常运行更慢。

此外,设置NINJA_SUMMARIZE_BUILD=1告诉autoninja在构建完成时打印构建性能摘要,显示最慢的构建步骤和最慢的构建步骤类型,如下所示:

$设置NINJA_SUMMARIZE_BUILD=1
$ autoninja -C out \默认基础
最长的构建步骤:
       0.1 加权 s 来构建 obj/base/base/trace_log.obj(6.7 秒经过时间)
       0.2 加权 s 构建 nasm.exe、nasm.exe.pdb(0.2 秒经过时间)
       0.3 加权 s 来构建 obj/base/base/win_util.obj(12.4 秒经过时间)
       1.2 加权 s 构建 base.dll、base.dll.lib(1.2 秒经过时间)
按构建步骤类型划分的时间:生成 6 个 .lib 文件
       的加权时间为0.0 秒(经过的时间总和为 0.3 秒)生成 25 个 .stamp 文件
       的加权时间为0.1 秒(经过的时间总和为1.2 秒)生成 20 个 .o 文件
       的加权时间为0.2 秒(经过的时间总和为2.8 秒)
       1.7 秒加权时间生成 4 个 PEFile(链接)文件(2.0 秒经过的
时间总和)生成 770 个 .obj 文件
      的加权时间为23.9 秒(经过的时间总和为974.8 秒)
26.1 秒加权时间(982.9 秒经过的时间总和,37.7 倍并行度)
完成 839 个构建步骤,平均 32.17/s

“加权”时间是每个构建步骤所用的时间除以并行运行的任务数。这使它非常接近缓慢步骤的“重要性”。完全或大部分序列化的链接将具有与其经过时间相同或相似的加权时间。与 999 个其他编译并行运行的编译将具有很小的加权时间。

您还可以通过在构建后手动运行脚本来生成这些报告:

$蟒蛇depot_tools \ p ost_build_ninja_summary.py -C出来\ d EFAULT

最后,设置NINJA_SUMMARIZE_BUILD=1告诉 autoninja 告诉 Ninja 通过传递“-d stats”来报告它自己的开销。例如,如果进程创建(显示在 StartEdge 指标中)使构建变慢,这可能会有所帮助,这可能是由于 clang-cl 不在排除目录中导致的防病毒干扰:

$设置NINJA_SUMMARIZE_BUILD=1
$ autoninja -C out \D efault base
 " c:\src\depot_tools\ninja.exe " -C out \D efault base -j 10 -d stats
指标计数 avg (us) 总计 (ms)
.ninja 解析 3555 1539.4 5472.6
规范化 str 1383032 0.0 12.7
规范化路径 1402349 0.0 11.2
查找节点 1398245 0.0 8.1
.ninja_log 负载 2 118.0 0.2
.ninja_deps 加载 2 67.5 0.1
节点统计 2516 29.6 74.4
depfile 加载 2 1132.0 2.3
开始边缘 88 3508.1 308.7
完成命令 87 1670.9 145.4
CLParser::解析 45 1889.1 85.0

您还可以使用ninjatracing获得构建性能的可视化报告 。这会将 .ninja_log 文件转换为可以加载到 chrome://tracing 的 .json 文件:

$蟒蛇ninjatracing出\ d EFAULT \。ninja_log > build.json

构建铬

使用 Ninja 使用以下命令构建 Chromium(“chrome”目标):

$ autoninja -C out \默认镀铬

autoninja是一个包装器,它自动为传递给 的参数提供最佳值ninja

您可以通过gn ls out/Default从命令行运行,从 GN 获取所有其他构建目标的列表 。要编译一个,将 GN 标签传递给 Ninja,前面没有“//”(因此//chrome/test:unit_tests 使用 ninja -C out/Default chrome/test:unit_tests`)。

运行铬

构建完成后,您可以简单地运行浏览器:

从$ \ d EFAULT \ C hrome.exe

(命令中的“.exe”后缀实际上是可选的)。

运行测试目标

您可以以相同的方式运行测试。您还可以使用--gtest_filterarg限制运行哪些测试,例如:

从$ \ d EFAULT带有\ U nit_tests.exe --gtest_filter = “ PushClientTest。* ”

您可以在其GitHub 页面上找到有关 GoogleTest 的更多信息 。

更新您的结帐

要更新现有的结帐,您可以运行

$ git rebase-update
$ gclient 同步 -D

第一个命令更新主要 Chromium 源存储库,并将您的任何本地分支重新建立在树尖(也称为 Git 分支origin/master)之上。如果你不想使用这个脚本,你也可以直接使用git pull或其他常用的 Git 命令来更新 repo。

第二个命令将子存储库同步到适当的版本,删除不再需要的那些,并根据需要重新运行钩子。

使用 Visual Studio IDE 进行编辑和调试

您可以使用 Visual Studio IDE 来编辑和调试 Chrome,无论是否支持 Intellisense。

使用 Visual Studio 智能感知

如果您想在开发 Chromium 时使用 Visual Studio Intellisense --ide,请gn gen在生成输出目录时使用 命令行参数(如获取代码 页中所述):

$ GN根--ide = VS出来\ d EFAULT
$ devenv的出\ d EFAULT \一ll.sln

GN 将all.sln在您的构建目录中生成一个文件。它将在内部使用 Ninja 进行编译,同时仍然允许大多数 IDE 功能工作(没有本机 Visual Studio 编译模式)。如果您再次手动运行“gen”,您将需要重新提供此参数,但通常 GN 会在您构建时自动保持构建和 IDE 文件最新。

生成的解决方案将包含数千个项目,加载速度非常慢。使用--filters参数限制仅为您感兴趣的代码生成项目文件。虽然这也会限制在项目资源管理器中显示的文件,但调试仍然有效,您可以在手动打开的文件中设置断点。允许您在 IDE 中编译和运行 Chrome 但不会显示任何源文件的最小解决方案是:

$ gn gen --ide=vs --filters=//chrome --no-deps out\Default

您可以选择性地添加你所关心的像这样的过滤器其他目录: --filters=//chrome;//third_party/WebKit/*;//gpu/*

还有其他选项可用于控制解决方案的生成方式,gn help gen为当前文档运行。

在没有 Intellisense 的情况下使用 Visual Studio

还可以在 Visual Studio 中调试和开发 Chrome,而无需多项目解决方案文件的开销。简单地“开放”你的chrome.exe的二进制,File->Open->Project/Solution或者从Visual Studio的命令提示符下,象这样:devenv /debugexe out\Debug\chrome.exe <your arguments>。许多 Visual Studio 的代码探索功能在此配置中不起作用,但通过安装VsChromium Visual Studio 扩展, 您可以使源代码与其他有用的功能(如代码搜索)一起出现在解决方案资源管理器窗口中。您可以将多个感兴趣的可执行文件(base_unittests.exe、browser_tests.exe)添加到您的解决方案中, File->Add->Existing Project...并通过右键单击它们Solution Explorer并选择来更改将要调试的一个Set as Startup Project. 您还可以通过右键单击它们Solution Explorer并选择 来 更改它们的属性,包括命令行参数Properties

默认情况下,当您在 Visual Studio 中开始调试时,调试器只会附加到主浏览器进程。要调试所有 Chrome,请安装 Microsoft 的 Child Process Debugging Power Tool。您还需要以管理员身份运行 Visual Studio,否则它将无法附加到 Chrome 的某些子进程。

0 条回应