Chromium Chronicle #7:预处理来源

第 7 集:由布鲁斯·道森在华盛顿州西雅图创作(2019 年 10 月)
上一集

有时,手动编译单个 Chromium 源文件会很有帮助。例如,您可以尝试使用编译器优化选项、将其预处理为单个文件,以了解一些细微的宏细节,或者最大限度地减少编译器 bug。

Chromium 开发者可以通过一些技巧找到并执行用于编译特定源文件的命令,并根据需要进行修改。

首先转到输出目录,并使用 autoninja(或 ninja)使用 ^ 后缀编译相关文件(以及任何依赖项)。在这种情况下,此后缀会告知 ninja 构建指定 file—version.o 的输出。然后,轻触该文件,并使用 -v(详细)标志再次将其编译(且仅编译)为 ninja:

在 Linux 或 OSX 上:

autoninja ../../base/version.cc^
touch ../../base/version.cc
autoninja -v ../../base/version.cc^

在 Windows cmd shell 中,^ 是一个特殊字符,必须进行转义:

C:\> autoninja ../../base/version.cc^^
C:\> touch ../../base/version.cc
C:\> autoninja -v ../../base/version.cc^^

autoninja -v 命令的典型输出如下所示(经过显著修改):

..\..\third_party\llvm-build\Release+Asserts\bin\clang-cl.exe /nologo /showIncludes -imsvc ...

此命令允许您编译相关文件。如需获取经过预处理的输出,请按以下步骤操作:

在 Linux 或 OSX 上,移除末尾的 -o obj/base/base/version.o 代码块,并添加 -E。这会告知编译器将预处理后的文件输出到 stdout。

将输出重定向到文件,如下所示:

../../third_party/llvm-build/Release+Asserts/bin/clang++ -MMD ... -E >version.i

在 Windows 上,从头移除 /showIncludes 选项(它会针对每个 #include 输出一行输出),然后添加 /P,以便对文件进行预处理而不是编译。结果将保存在 version.i 的当前目录中:

..\..\third_party\llvm-build\Release+Asserts\bin\clang-cl.exe /nologo -imsvc ... /P

现在,您可以检查预处理的文件以了解宏的实际作用,或者进行实验性编译器切换更改并重新编译,看看会发生什么情况。

其他资源

  • 快速 Chrome 构建:如需了解更多构建优化提示(侧重于 Windows)。
  • ETW:阅读 ETW(也称为 Xperf)文档,了解如何查找 Chrome 或 build 中的 Windows 性能问题。