The Chromium Chronicle #7: Preprocessing Source
Episode 7: by Bruce Dawson in Seattle, WA (October, 2019)
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 -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
..\..\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.