Chromium Chronicle #7:预处理来源

第 7 集:由 Bruce Dawson 拍摄,华盛顿州西雅图(2019 年 10 月)
上一集

有时,手动编译单个 Chromium 源文件会很有帮助, 不妨尝试使用编译器优化选项 来了解一些微妙的宏细节,或者尽可能减少 编译器 bug。

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

首先,前往输出目录,使用 autoninja(或 ninja) 使用 ^ 后缀编译相关文件(以及任何依赖项)。 此后缀会告知 ninja 构建指定 file—version.o 的输出 在本示例中为 id。然后,触摸该文件并使用 -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:了解如何在 Chrome 中找出 Windows 性能问题 或在 build 中测试 - 请阅读 ETW(也称为 Xperf)文档。