Chromium Chronicle image

The Chromium Chronicle #7: Preprocessing Source

Published on

Episode 7: by Bruce Dawson in Seattle, WA (October, 2019)
Previous episodes

Sometimes it is helpful to compile a single Chromium source file by hand, perhaps to experiment with compiler optimization options, to preprocess it to a single file to understand some subtle macro details, or to minimize a compiler bug.

A few tricks will let a Chromium developer find and execute the command that compiles a particular source file, with modifications as needed.

Start by going to your output directory and using autoninja (or ninja) to compile the file of interest (and any dependencies) using the ^ suffix. This suffix tells ninja to build the output of the specified file—version.o in this case. Then, touch the file, and compile it (and only it) again with the -v (verbose) flag to ninja:

On Linux or OSX:

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

In the Windows cmd shell ^ is a special character and must be escaped:

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

Typical output of the autoninja -v command looks like this (significantly trimmed):

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

This command allows you to compile the file of interest. To get the preprocessed output, use the following steps:

On Linux or OSX, remove the -o obj/base/base/version.o block from the end, and add -E. This tells the compiler to print the preprocessed file to stdout.

Redirect the output to a file, like this:

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

On Windows, remove the /showIncludes option from the beginning (it prints a line of output for each #include) and then add /P in order to preprocess the file instead of compiling it. The results will be saved in the current directory in version.i:

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

Now you can examine the preprocessed file to see what the macros are actually doing, or make experimental compiler-switch changes and recompile to see what happens.

Additional Resources

  • Fast Chrome Builds: For more build-optimization tips (focused on Windows).
  • ETW: Find out how to find Windows performance problems—in Chrome or in the build—by reading the ETW (also known as Xperf) docs.

Updated on Improve article

We serve cookies on this site to analyze traffic, remember your preferences, and optimize your experience.