Chromium ships a prebuilt clang binary. It's just upstream clang built at a known-good revision that we bump every two weeks or so.
This is the only supported compiler for building Chromium.
[TOC]
is_clang = false will make the build use system gcc on Linux. There are no
bots that test this and there is no guarantee it will work, but we accept
patches for this configuration.
https://groups.google.com/a/chromium.org/group/clang/topics
The chromium style plugin is used by default when clang is used.
If you're working on the plugin, you can build it locally like so:
- Run
./tools/clang/scripts/build.py --without-android --without-fuchsiato build the plugin. - Run
ninja -C third_party/llvm-build/Release+Asserts/to build incrementally after making changes. - Run
(cd tools/clang/plugins/tests && ./test.py ../../../../third_party/llvm-build/Release+Asserts/bin/clang)to test the plugin after making changes. - Build Chromium with clang as usual, but, if you use reclient, disable it.
The local plugin will then be used for local builds until the next
gclient sync restores the default toolchain.
Since the plugin is rolled with clang changes, behavior changes to the plugin should be guarded by flags to make it easy to roll clang without introducing unexpected breakage. A general outline:
- Implement new plugin behavior behind a flag, disabled by default.
- Wait for a compiler roll to bring in the flag.
- Start passing the new flag in
GNand verify the new behavior. - Enable the new plugin behavior unconditionally and update the plugin to ignore the flag.
- Wait for another compiler roll.
- Stop passing the flag from
GN. - Remove the flag completely.
clang is the default compiler on Windows. It uses MSVC's SDK, so you still need to have Visual Studio with C++ support installed.
There are three main ways of using a custom clang (or lld, etc.) binary for the build.
-
Point the Chromium build to your custom clang.
Set
clang_base_pathin your args.gn to the llvm build directory containingbin/clang(i.e. the directory you ran cmake). This must be an absolute path. You also need to disable chromium's clang plugins.Here's an example that also disables debug info and enables the component build (both not strictly necessary, but they will speed up your build):
clang_base_path = getenv("HOME") + "/src/llvm-build" clang_use_chrome_plugins = false is_debug = false symbol_level = 1 is_component_build = trueOn Windows, for
clang_base_pathuse something like this instead:clang_base_path = "c:/src/llvm-build"You can then look in
out/gn/toolchain.ninjaand check that therule ccandrule cxxcommands run your clang binary. If things look good, runninja -C out/gnto build.Chromium tries to be buildable with its currently pinned clang, and with clang trunk. Set
llvm_force_head_revision = truein your args.gn if the clang you're trying to build with is closer to clang trunk than to Chromium's pinned clang (whichtools/clang/scripts/update.py --print-revisionprints). -
Bring your custom clang into the Chromium tree.
Chromium's clang binary lives at
third_party/llvm-build/Release+Asserts/bin/clang(orclang-cl.exeon Windows). You can just copy your custom binary over that. Maybe a symlink works too.Unless your Clang includes support for Chromium's plugins, you'll still need to set
clang_use_chrome_plugins=false.To get back to a default state when you're done, you can delete
third_party/llvm-build/and re-sync. -
Rebuild Chromium's clang using
tools/clang/scripts/build.py.The binaries under
third_party/llvm-build/are produced bybuild.py, using source code underthird_party/llvm/. You can run the script to build it yourself, with modifications.For example, you can check out a specific revision under
third_party/llvm, apply any local modifications, and build withbuild.py --skip-checkoutto build a toolchain without overwriting your changes.
If you have access to remote execution (RBE), you can use that also with a
locally built clang binary -- as long as you're on Linux and the binary is
located inside the Chromium source tree (methods 2 and 3 above). Just set
use_remoteexec=true in your gn args.
See crbug.com/451733085 for an example of using the third approach to bisect over LLVM.
-
Toolchain support gives an overview of clang rolls, and documents when to revert clang rolls and how to file good toolchain bugs.
-
Updating clang documents the mechanics of updating clang, and which files are included in the default clang package.
-
Clang Sheriffing contains instructions for how to debug compiler bugs, for clang sheriffs.
-
Clang Tool Refactoring has notes on how to build and run refactoring tools based on clang's libraries.
-
Updating Clang format binaries has notes on how to update clang-format.