# Clang [Clang](http://clang.llvm.org/) is the main supported compiler when building Chromium on all platforms. Known [clang bugs and feature requests](http://code.google.com/p/chromium/issues/list?q=label:clang). [TOC] ## Building with clang 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` ## Reverting to gcc on Linux or MSVC on Windows 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. ## Mailing List https://groups.google.com/a/chromium.org/group/clang/topics ## Using plugins The [chromium style plugin](https://dev.chromium.org/developers/coding-style/chromium-style-checker-errors) is used by default when clang is used. If you're working on the plugin, you can build it locally like so: 1. Run `./tools/clang/scripts/update.py --force-local-build --without-android` to build the plugin. 1. Run `ninja -C third_party/llvm-build/Release+Asserts/` to build incrementally. 1. 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: 1. Implement new plugin behavior behind a flag. 1. Wait for a compiler roll to bring in the flag. 1. Start passing the new flag in `GN` and verify the new behavior. 1. Enable the new plugin behavior unconditionally and update the plugin to ignore the flag. 1. Wait for another compiler roll. 1. Stop passing the flag from `GN`. 1. Remove the flag completely. ## Using the clang static analyzer See [clang_static_analyzer.md](clang_static_analyzer.md). ## Windows 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](https://github.com/adoxa/ansicon/releases). ## Using a custom clang binary 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.