第 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 性能问题。