There are instructions for other platforms linked from the get the code page.
Are you a Google employee? See go/building-chrome-win instead.
As of September, 2017 (R503915) Chromium requires Visual Studio 2017 update 3.2 with the 15063 (Creators Update) Windows SDK or later to build. Visual Studio Community Edition should work if its license is appropriate for you. You must install the “Desktop development with C++” component and the “MFC and ATL support” sub-component. This can be done from the command line by passing these arguments to the Visual Studio installer that you download:
--add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Component.VC.ATLMFC --includeRecommended
You must have the Windows 10 SDK installed, version 10.0.15063 or later. The 10.0.15063 SDK initially had errors but the 10.0.15063.468 version works well. Most of this will be installed by Visual Studio.
If the Windows 10 SDK was installed via the Visual Studio installer, the Debugging Tools can be installed by going to: Control Panel → Programs → Programs and Features → Select the “Windows Software Development Kit” → Change → Change → Check “Debugging Tools For Windows” → Change. Or, you can download the standalone SDK installer and use it to install the Debugging Tools.
Download the depot_tools bundle and extract it somewhere.
Add depot_tools to the start of your PATH (must be ahead of any installs of Python). Assuming you unzipped the bundle to C:\src\depot_tools, open:
Control Panel → System and Security → System → Advanced system settings
If you have Administrator access, Modify the PATH system variable and put
C:\src\depot_tools at the front (or at least in front of any directory that might already have a copy of Python or Git).
If you don't have Administrator access, you can add a user-level PATH environment variable and put
C:\src\depot_tools at the front, but if your system PATH has a Python in it, you will be out of luck.
Also, add a DEPOT_TOOLS_WIN_TOOLCHAIN system variable in the same way, and set it to 0. This tells depot_tools to use your locally installed version of Visual Studio (by default, depot_tools will try to use a google-internal version).
From a cmd.exe shell, run the command gclient (without arguments). On first run, gclient will install all the Windows-specific bits needed to work with the code, including msysgit and python.
After running gclient open a command prompt and type
where python and confirm that the depot_tools
python.bat comes ahead of any copies of python.exe. Failing to ensure this can lead to overbuilding when using gn - see crbug.com/611087.
First, configure Git:
$ git config --global user.name "My Name" $ git config --global user.email "firstname.lastname@example.org" $ git config --global core.autocrlf false $ git config --global core.filemode false $ git config --global branch.autosetuprebase always
chromium directory for the checkout and change to it (you can call this whatever you like and put it wherever you like, as long as the full path has no spaces):
$ mkdir chromium && cd chromium
fetch tool from
depot_tools to check out the code and its dependencies.
$ fetch chromium
If you don't want the full repo history, you can save a lot of time by adding the
--no-history flag to
Expect the command to take 30 minutes on even a fast connection, and many hours on slower ones.
fetch completes, it will have created a hidden
.gclient file and a directory called
src in the working directory. The remaining instructions assume you have switched to the
$ cd src
Optional: You can also install API keys if you want your build to talk to some Google services, but this is not necessary for most development and testing purposes.
Chromium uses Ninja as its main build tool along with a tool called GN to generate
.ninja files. You can create any number of build directories with different configurations. To create a build directory:
$ gn gen out/Default
Defaultwith another name, but it should be a subdirectory of
gn helpon the command line or read the quick start guide.
If you want to use the Visual Studio IDE, use the
--ide command line argument to
gn gen when you generate your output directory (as described on the get the code page):
$ gn gen --ide=vs out\Default $ devenv out\Default\all.sln
GN will produce a file
all.sln in your build directory. It will internally use Ninja to compile while still allowing most IDE functions to work (there is no native Visual Studio compilation mode). If you manually run “gen” again you will need to resupply this argument, but normally GN will keep the build and IDE files up to date automatically when you build.
The generated solution will contain several thousand projects and will be very slow to load. Use the
--filters argument to restrict generating project files for only the code you're interested in, although this will also limit what files appear in the project explorer. A minimal solution that will let you compile and run Chrome in the IDE but will not show any source files is:
$ gn gen --ide=vs --filters=//chrome out\Default
There are other options for controlling how the solution is generated, run
gn help gen for the current documentation.
There are some gn flags that can improve build speeds. You can specify these in the editor that appears when you create your output directory (
gn args out/Default) or on the gn gen command line (
gn gen out/Default --args="is_component_build = true is_debug = true"). Some helpful settings to consider using include:
use_jumbo_build = true- Experimental Jumbo/unity builds.
is_component_build = true- this uses more, smaller DLLs, and incremental linking.
enable_nacl = false- this disables Native Client which is usually not needed for local builds.
target_cpu = "x86"- x86 builds are slightly faster than x64 builds and support incremental linking for more targets. Note that if you set this but don‘t’ set enable_nacl = false then build times may get worse.
remove_webcore_debug_symbols = true- turn off source-level debugging for blink to reduce build times, appropriate if you don't plan to debug blink.
win_linker_timing = true- this should not generally be set but can be helpful when trying to understand build times or incremental linking failures.
In addition, Google employees should consider using goma, a distributed compilation system. Detailed information is available internally but the relevant gn args are:
use_goma = true
symbol_level = 2- by default goma builds change symbol_level from 2 to 1 which disables source-level debugging. This turns it back on. This actually makes builds slower, but it makes goma more usable.
is_win_fastlink = true- this is required if you have goma enabled and symbol_level set to 2.
Note that debugging of is_win_fastlink built binaries is unreliable prior to VS 2017 Update 3 and may crash Visual Studio.
To get any benefit from goma it is important to pass a large -j value to ninja. A good default is 10*numCores to 20*numCores. If you run autoninja.bat then it will pass an appropriate -j value to ninja for goma or not, automatically.
When invoking ninja specify ‘chrome’ as the target to avoid building all test binaries as well.
Still, builds will take many hours on many machines.
Build Chromium (the “chrome” target) with Ninja using the command:
$ ninja -C out\Default chrome
You can get a list of all of the other build targets from GN by running
gn ls out/Default from the command line. To compile one, pass to Ninja the GN label with no preceding “//” (so for
//chrome/test:unit_tests use ninja -C out/Default chrome/test:unit_tests`).
Once it is built, you can simply run the browser:
(The “.exe” suffix in the command is actually optional).
You can run the tests in the same way. You can also limit which tests are run using the
--gtest_filter arg, e.g.:
$ out\Default\unit_tests.exe --gtest_filter="PushClientTest.*"
You can find out more about GoogleTest at its GitHub page.
To update an existing checkout, you can run
$ git rebase-update $ gclient sync
The first command updates the primary Chromium source repository and rebases any of your local branches on top of tip-of-tree (aka the Git branch
origin/master). If you don't want to use this script, you can also just use
git pull or other common Git commands to update the repo.
The second command syncs the subrepositories to the appropriate versions and re-runs the hooks as needed.