Clang is the main supported compiler when building Chromium on all platforms.
Known clang bugs and feature requests.
[TOC]
This happens by default, with clang binaries being fetched by gclient
during the gclient runhooks
phase. To fetch them manually, or build
a local custom clang, use
tools/clang/scripts/update.py
Run gn args
and make sure there is no is_clang = false
in your args.gn file.
Build: ninja -C out/gn chrome
There are no bots that test this but is_clang = false
will revert to
gcc on Linux and to Visual Studio on Windows. There is no guarantee it
will work.
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/update.py --force-local-build --without-android
to build the plugin. - Run
ninja -C third_party/llvm-build/Release+Asserts/
to build incrementally. - Build with clang like described above, but, if you use goma, disable it.
To test the FindBadConstructs plugin, run:
(cd tools/clang/plugins/tests && \
./test.py ../../../../third_party/llvm-build/Release+Asserts/bin/clang \
../../../../third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so)
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. A general outline:
- Implement new plugin behavior behind a flag.
- Wait for a compiler roll to bring in the flag.
- Start passing the new flag in
GN
and 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.
Since October 2017, clang is the default compiler on Windows. It uses MSVC's linker and SDK, so you still need to have Visual Studio with C++ support installed.
To use MSVC's compiler (if it still works), use is_clang = false
.
Current brokenness:
- To get colored diagnostics, you need to be running ansicon.
Set clang_base_path
in your args.gn to the llvm build directory containing
bin/clang
(i.e. the directory you ran cmake). This [must][1] be an absolute
path. You also need to disable chromium's clang plugin.
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 = true
You can then run head out/gn/toolchain.ninja
and check that the first to
lines set cc
and cxx
to your clang binary. If things look good, run ninja -C out/gn
to build.
If your clang revision is very different from the one currently used in chromium
- Check
tools/clang/scripts/update.py
to find chromium's clang revision - You might have to tweak warning flags.
Experimental!
LLD is a relatively new linker from LLVM. The current focus is on Windows and Linux support, where it can link Chrome approximately twice as fast as gold and MSVC's link.exe as of this writing.
Set use_lld = true
in args.gn.