blob: 08b60a0ec431b348b45761c54d33b88229485031 [file] [log] [blame] [view]
dpranke1a70d0c2016-12-01 02:42:291# Checking out and Building Chromium for Windows
2
Bruce Dawson4d1de592017-09-08 00:24:003There are instructions for other platforms linked from the
dpranke1a70d0c2016-12-01 02:42:294[get the code](get_the_code.md) page.
tfarina502f3882016-03-23 12:48:105
dpranke1a70d0c2016-12-01 02:42:296## Instructions for Google Employees
7
8Are you a Google employee? See
scottmg292538ae2017-01-12 00:10:559[go/building-chrome-win](https://goto.google.com/building-chrome-win) instead.
dpranke0ae7cad2016-11-30 07:47:5810
11[TOC]
12
13## System requirements
14
Bruce Dawsonc2661722024-06-12 19:44:2915* An x86-64 machine with at least 8GB of RAM. More than 16GB is highly
dpranke0ae7cad2016-11-30 07:47:5816 recommended.
dpranke4b470c5b2017-01-19 17:38:0417* At least 100GB of free disk space on an NTFS-formatted hard drive. FAT32
18 will not work, as some of the Git packfiles are larger than 4GB.
Bruce Dawson97367b72017-10-18 00:47:4919* An appropriate version of Visual Studio, as described below.
Bruce Dawson52c749c2020-12-03 16:44:2620* Windows 10 or newer.
brettwc25693b32016-05-26 01:11:5221
tfarina502f3882016-03-23 12:48:1022## Setting up Windows
23
dpranke0ae7cad2016-11-30 07:47:5824### Visual Studio
tfarina502f3882016-03-23 12:48:1025
Bruce Dawsond95ceb62023-02-17 01:39:3026Chromium requires [Visual Studio 2022](https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-notes) (>=17.0.0)
27to build. Visual Studio can also be used to debug Chromium.
Raul Tambre1bb5c1a2018-12-29 00:57:1228The clang-cl compiler is used but Visual Studio's header files, libraries, and
29some tools are required. Visual Studio Community Edition should work if its
30license is appropriate for you. You must install the "Desktop development with
31C++" component and the "MFC/ATL support" sub-components. This can be done from
32the command line by passing these arguments to the Visual Studio installer (see
33below for ARM64 instructions):
Bruce Dawson1c0979a62017-09-13 17:47:2134```shell
Bruce Dawsone42d7642018-12-10 23:50:0035$ PATH_TO_INSTALLER.EXE ^
36--add Microsoft.VisualStudio.Workload.NativeDesktop ^
37--add Microsoft.VisualStudio.Component.VC.ATLMFC ^
38--includeRecommended
Bruce Dawson1c0979a62017-09-13 17:47:2139```
pwnall43b43ba2016-08-22 19:29:2940
Bruce Dawsone42d7642018-12-10 23:50:0041If you want to build for ARM64 Win32 then some extra arguments are needed. The
42full set for that case is:
43```shell
44$ PATH_TO_INSTALLER.EXE ^
45--add Microsoft.VisualStudio.Workload.NativeDesktop ^
46--add Microsoft.VisualStudio.Component.VC.ATLMFC ^
47--add Microsoft.VisualStudio.Component.VC.Tools.ARM64 ^
48--add Microsoft.VisualStudio.Component.VC.MFC.ARM64 ^
49--includeRecommended
50```
51
Solomon Kinard45427072023-06-22 18:21:0152Required
Bruce Dawsone9f20fff2018-03-03 01:58:3853
Solomon Kinard45427072023-06-22 18:21:0154* [Windows 11 SDK](https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/)
Devon Loehr0f6eaa52024-10-16 16:22:0155version 10.0.26100.1742. This can be installed separately or by checking the
Solomon Kinard45427072023-06-22 18:21:0156appropriate box in the Visual Studio Installer.
Devon Loehr0f6eaa52024-10-16 16:22:0157* (Windows 11) SDK Debugging Tools 10.0.26100.1742 or higher. This version of the
Bruce Dawson7ff6e7d2024-03-15 22:31:2058Debugging tools is needed in order to support reading the large-page PDBs that
59Chrome uses to allow greater-than 4 GiB PDBs. This can be installed after the
60matching Windows SDK version is installed, from: Control Panel -> Programs and
61Features
Solomon Kinard45427072023-06-22 18:21:0162-> Windows Software Development Kit [version] -> Change -> Debugging Tools for
Bruce Dawson9588daa2023-10-18 22:07:2563Windows. If building on ARM64 Windows then you will need to manually copy the
64Debuggers\x64 directory from another machine because it does not get installed
65on ARM64 and is needed, whether you are building Chromium for x64 or ARM64 on
66ARM64.
Robert Sesekc8ffa1b2017-08-04 19:55:2267
Devon Loehr0f6eaa52024-10-16 16:22:0168WARNING: On sufficiently old versions of Windows (1909 or earlier), dawn (or related
69components) may fail with a D3d-related error when using the 26100 SDK. This is because the
70d3dcompiler_47.dll file in the new SDK attempts to dynamically link versions of the Universal
71C Runtime which are not present by default on older systems. If you experience these errors,
72you can either update the UCRT on your system, or install the 22612 SDK and use the
73d3dcompiler_47.dll file included there, which statically links the UCRT.
74
Anne Redulla7b370052024-09-09 00:39:3575## git installation
76
77### Install git
78
79If you haven't installed `git` directly before, you can download a standalone
80installer for the latest version of Git For Windows from the Git website at
81https://git-scm.com/download/win.
82
83For more information on Git for Windows (which is a separate project from Git),
84see https://gitforwindows.org.
85
Fumitoshi Ukai9284cff42024-09-11 01:59:2986Note: if you are a Google employee, see [go/building-chrome-win#install-git](https://goto.google.com/building-chrome-win#install-git).
Anne Redulla7b370052024-09-09 00:39:3587
88### Update git
89
90Note: this section is about updating a direct installation of `git` because
91`depot_tools` will soon stop bundling `git`.
92
93If you have already set up `depot_tools` and would like to update an existing
94directly-installed `git`, you must first
95[modify your PATH](#modify-path-for-git) to prefer the non-`depot_tools` `git`.
96
97Updating to the latest version of `git` will depend on which version you
98currently have installed. First, check your `git` version. From a cmd.exe shell,
99run:
100```shell
101$ git version
102```
103
104| Current version | How to update to latest |
105| --- | --- |
106| `2.14.1` or earlier | You will need to manually uninstall Git, then follow the instructions above to [install git](#install-git) |
107| `2.14.2` to `2.16.1` | In a cmd.exe shell, run: `git update` |
108| `2.16.1(2)` and later | In a cmd.exe shell, run: `git update-git-for-windows` |
109
dpranke0ae7cad2016-11-30 07:47:58110## Install `depot_tools`
tfarina502f3882016-03-23 12:48:10111
Anne Redulla7b370052024-09-09 00:39:35112***
113**Warning:** `depot_tools` will stop bundling Git for Windows from Sep 23, 2024
114onwards. To prepare for this change, Windows users should
115[install Git](#git-installation) directly before then.
116***
117
Solomon Kinard45427072023-06-22 18:21:01118Download the
119[depot_tools bundle](https://storage.googleapis.com/chrome-infra/depot_tools.zip)
Eric Waldmanc469ba7b2022-03-02 20:33:00120and extract it somewhere (eg: C:\src\depot_tools).
tfarina502f3882016-03-23 12:48:10121
Solomon Kinard45427072023-06-22 18:21:01122***
dpranke0ae7cad2016-11-30 07:47:58123**Warning:** **DO NOT** use drag-n-drop or copy-n-paste extract from Explorer,
124this will not extract the hidden “.git” folder which is necessary for
Bruce Dawson4d1de592017-09-08 00:24:00125depot_tools to autoupdate itself. You can use “Extract all…” from the
dpranke0ae7cad2016-11-30 07:47:58126context menu though.
127***
tfarina502f3882016-03-23 12:48:10128
Bruce Dawson4d1de592017-09-08 00:24:00129Add depot_tools to the start of your PATH (must be ahead of any installs of
Eric Waldmanc469ba7b2022-03-02 20:33:00130Python. Note that environment variable names are case insensitive).
Anne Redulla7b370052024-09-09 00:39:35131* Assuming you unzipped the bundle to `C:\src\depot_tools`, open:
132 Control Panel → System and Security → System
133* Select which PATH variable to edit.
134 * If you have Administrator access, you can edit the **system** PATH. Click
135 Advanced system settings → Environment Variables. Under "System variables",
136 select the Path variable for editing.
137 * If you don't have Administrator access, you can edit your **user-level**
138 PATH. Search for "Edit environment variables for your account". Under "User
139 variables for %USER%", select the Path variable for editing.
140* Modify the Path variable by adding `C:\src\depot_tools` at the front (or at
141 least in front of any directory that might already have a copy of Python).
142 Note: If you can only modify your user-level PATH and the system PATH has a
143 Python in it, you will be out of luck.
144
145***
146### Modify PATH for git
147**Optional:** You can modify your PATH to prefer using an independently installed
148`git` over the version currently bundled with `depot_tools`. If you are happy to
149keep using the bundled `git` within `depot_tools` until it is removed, you can
150skip this step.
151
152* Assuming you installed Git at `C:\Program Files\Git`, edit your system or
153 user-level PATH in the same way when `C:\src\depot_tools` was added.
154 Modify the Path variable by adding the following *before*
155 `C:\src\depot_tools`:
156 * `C:\Program Files\Git\cmd`
157 * `C:\Program Files\Git\mingw64\bin`
158 * `C:\Program Files\Git\usr\bin`
159***
dpranke0ae7cad2016-11-30 07:47:58160
Wan-Teh Chang03912872022-03-14 23:07:34161Also, add a DEPOT_TOOLS_WIN_TOOLCHAIN environment variable in the same way, and set
dpranke0ae7cad2016-11-30 07:47:58162it to 0. This tells depot_tools to use your locally installed version of Visual
Aaron Gabledad9e0f2020-01-09 19:38:52163Studio (by default, depot_tools will try to use a google-internal version).
dpranke0ae7cad2016-11-30 07:47:58164
Bruce Dawsond95ceb62023-02-17 01:39:30165You may also have to set variable `vs2022_install` to your installation path of
166Visual Studio 2022, like
167`set vs2022_install=C:\Program Files\Microsoft Visual Studio\2022\Professional`.
Andreas Papacharalampous1d22c9612020-06-13 23:11:17168
Reilly Grant07ff22e2021-10-19 19:21:20169From a cmd.exe shell, run:
Reilly Grant07ff22e2021-10-19 19:21:20170```shell
171$ gclient
172```
173
174On first run, gclient will install all the Windows-specific bits needed to work
175with the code, including msysgit and python.
dpranke0ae7cad2016-11-30 07:47:58176
177* If you run gclient from a non-cmd shell (e.g., cygwin, PowerShell),
178 it may appear to run properly, but msysgit, python, and other tools
179 may not get installed correctly.
180* If you see strange errors with the file system on the first run of gclient,
Yuma Takaid4809d552022-02-15 03:48:19181 you may want to [disable Windows Indexing](https://tortoisesvn.net/faq.html#cantmove2).
dpranke0ae7cad2016-11-30 07:47:58182
Will Harris1c8f89c2021-03-08 22:53:43183## Check python install
184
henrikab232d892024-04-05 14:53:31185After running gclient open a command prompt and type `where python3` and
186confirm that the depot_tools `python3.bat` comes ahead of any copies of
187python3.exe. Failing to ensure this can lead to overbuilding when
dpranke0ae7cad2016-11-30 07:47:58188using gn - see [crbug.com/611087](https://crbug.com/611087).
189
Will Harris1c8f89c2021-03-08 22:53:43190[App Execution Aliases](https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/desktop-to-uwp-extensions#alias)
191can conflict with other installations of python on the system so disable
192these for 'python.exe' and 'python3.exe' by opening 'App execution aliases'
193section of Control Panel and unticking the boxes next to both of these
194that point to 'App Installer'.
195
dpranke0ae7cad2016-11-30 07:47:58196## Get the code
197
Leonard Mosescu718c9ac2017-06-20 18:06:32198First, configure Git:
199
200```shell
201$ git config --global user.name "My Name"
202$ git config --global user.email "[email protected]"
203$ git config --global core.autocrlf false
204$ git config --global core.filemode false
205$ git config --global branch.autosetuprebase always
206```
207
Bruce Dawsonc2c02e52023-11-22 04:43:15208While not necessarily required it can be helpful to configure git to allow long
209path support (beyond the Windows MAX_PATH limit):
210
211```shell
212git config --global core.longpaths true
213```
214
Sonja Laurilac8949372023-06-27 10:09:23215Create a `chromium` directory for the checkout and change to it. You can call
216this whatever you like and put it wherever you like, as long as the full path
217has no spaces. However there are some performance benefits for Googlers in
218placing the directory under `C:\src\`
219(See [Why is my build slow?](https://chromium.googlesource.com/chromium/src/+/main/docs/windows_build_instructions.md#why-is-my-build-slow)).
dpranke0ae7cad2016-11-30 07:47:58220
sdy93387fa2016-12-01 01:03:44221```shell
222$ mkdir chromium && cd chromium
223```
224
225Run the `fetch` tool from `depot_tools` to check out the code and its
dpranke0ae7cad2016-11-30 07:47:58226dependencies.
227
sdy93387fa2016-12-01 01:03:44228```shell
xiaoyin.l802e4b3e2016-12-04 22:17:30229$ fetch chromium
sdy93387fa2016-12-01 01:03:44230```
dpranke0ae7cad2016-11-30 07:47:58231
232If you don't want the full repo history, you can save a lot of time by
sdy93387fa2016-12-01 01:03:44233adding the `--no-history` flag to `fetch`.
dpranke0ae7cad2016-11-30 07:47:58234
Bruce Dawson2c83223e2022-10-25 21:08:22235Expect the command to take over an hour on even a fast connection, and many
236hours on slower ones. You should configure your PC so that it doesn't sleep
237or hibernate during the fetch or else errors may occur. If errors occur while
238fetching sub-repos then you can start over, or you may be able to correct them
239by going to the chromium/src directory and running this command:
240
241```shell
242$ gclient sync
243```
dpranke0ae7cad2016-11-30 07:47:58244
sdy93387fa2016-12-01 01:03:44245When `fetch` completes, it will have created a hidden `.gclient` file and a
246directory called `src` in the working directory. The remaining instructions
247assume you have switched to the `src` directory:
dpranke0ae7cad2016-11-30 07:47:58248
sdy93387fa2016-12-01 01:03:44249```shell
250$ cd src
251```
dpranke0ae7cad2016-11-30 07:47:58252
sdy93387fa2016-12-01 01:03:44253*Optional*: You can also [install API
254keys](https://www.chromium.org/developers/how-tos/api-keys) if you want your
255build to talk to some Google services, but this is not necessary for most
256development and testing purposes.
dpranke0ae7cad2016-11-30 07:47:58257
dpranke1a70d0c2016-12-01 02:42:29258## Setting up the build
dpranke0ae7cad2016-11-30 07:47:58259
Tom Bridgwatereef401542018-08-17 00:54:43260Chromium uses [Ninja](https://ninja-build.org) as its main build tool along with
Andrew Williamsbbc1a1e2021-07-21 01:51:22261a tool called [GN](https://gn.googlesource.com/gn/+/main/docs/quick_start.md)
Tom Bridgwatereef401542018-08-17 00:54:43262to generate `.ninja` files. You can create any number of *build directories*
263with different configurations. To create a build directory:
dpranke0ae7cad2016-11-30 07:47:58264
sdy93387fa2016-12-01 01:03:44265```shell
Andrew Williamsfa9b7d62023-03-20 15:48:28266$ gn gen out\Default
sdy93387fa2016-12-01 01:03:44267```
dpranke0ae7cad2016-11-30 07:47:58268
sdy93387fa2016-12-01 01:03:44269* You only have to run this once for each new build directory, Ninja will
270 update the build files as needed.
271* You can replace `Default` with another name, but
272 it should be a subdirectory of `out`.
Aaron Gabledad9e0f2020-01-09 19:38:52273* For other build arguments, including release settings or using an alternate
274 version of Visual Studio, see [GN build
sdy93387fa2016-12-01 01:03:44275 configuration](https://www.chromium.org/developers/gn-build-configuration).
dpranke0ae7cad2016-11-30 07:47:58276 The default will be a debug component build matching the current host
277 operating system and CPU.
Tom Bridgwatereef401542018-08-17 00:54:43278* For more info on GN, run `gn help` on the command line or read the [quick
Andrew Williamsbbc1a1e2021-07-21 01:51:22279 start guide](https://gn.googlesource.com/gn/+/main/docs/quick_start.md).
Juan Cruz Viotti9c7622d2021-06-30 00:27:23280
dpranke0ae7cad2016-11-30 07:47:58281### Faster builds
tfarina502f3882016-03-23 12:48:10282
dpranke0ae7cad2016-11-30 07:47:58283* Reduce file system overhead by excluding build directories from
284 antivirus and indexing software.
285* Store the build tree on a fast disk (preferably SSD).
brucedawsoncfc7fd52017-07-06 18:41:01286* The more cores the better (20+ is not excessive) and lots of RAM is needed
287(64 GB is not excessive).
tfarina502f3882016-03-23 12:48:10288
brucedawsoncfc7fd52017-07-06 18:41:01289There are some gn flags that can improve build speeds. You can specify these
290in the editor that appears when you create your output directory
Andrew Williamsfa9b7d62023-03-20 15:48:28291(`gn args out\Default`) or on the gn gen command line
292(`gn gen out\Default --args="is_component_build = true is_debug = true"`).
brucedawsoncfc7fd52017-07-06 18:41:01293Some helpful settings to consider using include:
Bruce Dawson2c83223e2022-10-25 21:08:22294* `is_component_build = true` - this uses more, smaller DLLs, and may avoid
295having to relink chrome.dll after every change.
Bruce Dawsonfcd3deb12017-07-28 17:12:20296* `enable_nacl = false` - this disables Native Client which is usually not
297needed for local builds.
Bruce Dawson2c83223e2022-10-25 21:08:22298* `target_cpu = "x86"` - x86 builds may be slightly faster than x64 builds. Note
299that if you set this but don't set `enable_nacl = false` then build times may
300get worse.
James Cook26699a92019-03-12 22:23:10301* `blink_symbol_level = 0` - turn off source-level debugging for
brucedawsoncfc7fd52017-07-06 18:41:01302blink to reduce build times, appropriate if you don't plan to debug blink.
Bruce Dawson63e0be72021-11-29 20:34:41303* `v8_symbol_level = 0` - turn off source-level debugging for v8 to reduce
304build times, appropriate if you don't plan to debug v8.
brucedawsoncfc7fd52017-07-06 18:41:01305
Bruce Dawson817f47fb2020-05-01 22:29:08306In order to speed up linking you can set `symbol_level = 1` or
307`symbol_level = 0` - these options reduce the work the compiler and linker have
308to do. With `symbol_level = 1` the compiler emits file name and line number
309information so you can still do source-level debugging but there will be no
310local variable or type information. With `symbol_level = 0` there is no
311source-level debugging but call stacks still have function names. Changing
312`symbol_level` requires recompiling everything.
brucedawsoncfc7fd52017-07-06 18:41:01313
Andrew Williams54da9cc2024-01-09 17:32:23314When invoking ninja, specify 'chrome' as the target to avoid building all test
315binaries as well.
316
Ben Segall4a89ec52023-09-26 15:02:56317#### Use Reclient
318
Andrew Williams54da9cc2024-01-09 17:32:23319In addition, Google employees should use Reclient, a distributed compilation system.
Ben Segall4a89ec52023-09-26 15:02:56320Detailed information is available internally but the relevant gn arg is:
321* `use_remoteexec = true`
322
Solomon Kinard5cd00762023-11-04 00:47:19323Google employees can visit
Andrew Williams54da9cc2024-01-09 17:32:23324[go/building-chrome-win#setup-remote-execution](https://goto.google.com/building-chrome-win#setup-remote-execution)
325for more information. For external contributors, Reclient does not support
326Windows builds.
Ben Segall4a89ec52023-09-26 15:02:56327
Juan Cruz Viotti9c7622d2021-06-30 00:27:23328#### Use SCCACHE
329
330You might be able to use [sccache](https://github.com/mozilla/sccache) for the
331build process by enabling the following arguments:
332
333* `cc_wrapper = "sccache"` - assuming the `sccache` binary is in your `%PATH%`
334* `chrome_pgo_phase = 0`
335
Bruce Dawsone9f20fff2018-03-03 01:58:38336### Why is my build slow?
337
338Many things can make builds slow, with Windows Defender slowing process startups
339being a frequent culprit. Have you ensured that the entire Chromium src
Bruce Dawson0bbe2d42018-03-06 19:45:55340directory is excluded from antivirus scanning (on Google machines this means
Bruce Dawsone9f20fff2018-03-03 01:58:38341putting it in a ``src`` directory in the root of a drive)? Have you tried the
342different settings listed above, including different link settings and -j
343values? Have you asked on the chromium-dev mailing list to see if your build is
344slower than expected for your machine's specifications?
345
Bruce Dawson15104782023-10-19 20:06:23346If you suspect that Defender is slowing your build then you can try Microsoft's
347[Performance analyzer for Microsoft Defender Antivirus](https://learn.microsoft.com/en-us/microsoft-365/security/defender-endpoint/tune-performance-defender-antivirus?view=o365-worldwide)
348to investigate in detail.
349
Bruce Dawson89390172019-05-08 09:51:18350The next step is to gather some data. If you set the ``NINJA_SUMMARIZE_BUILD``
Bruce Dawsonb9988e92019-09-16 17:01:10351environment variable to 1 then ``autoninja`` will do three things. First, it
352will set the [NINJA_STATUS](https://ninja-build.org/manual.html#_environment_variables)
Bruce Dawson89390172019-05-08 09:51:18353environment variable so that ninja will print additional information while
354building Chrome. It will show how many build processes are running at any given
355time, how many build steps have completed, how many build steps have completed
356per second, and how long the build has been running, as shown here:
Bruce Dawsone9f20fff2018-03-03 01:58:38357
358```shell
Bruce Dawson89390172019-05-08 09:51:18359$ set NINJA_SUMMARIZE_BUILD=1
Bruce Dawsone9f20fff2018-03-03 01:58:38360$ autoninja -C out\Default base
361ninja: Entering directory `out\Default'
362[1 processes, 86/86 @ 2.7/s : 31.785s ] LINK(DLL) base.dll base.dll.lib base.dll.pdb
363```
364
Bruce Dawson89390172019-05-08 09:51:18365This makes slow process creation immediately obvious and lets you tell quickly
366if a build is running more slowly than normal.
367
368In addition, setting ``NINJA_SUMMARIZE_BUILD=1`` tells ``autoninja`` to print a
369build performance summary when the build completes, showing the slowest build
370steps and slowest build-step types, as shown here:
Bruce Dawsone9f20fff2018-03-03 01:58:38371
372```shell
373$ set NINJA_SUMMARIZE_BUILD=1
374$ autoninja -C out\Default base
Bruce Dawson2721f0b2019-11-08 18:41:27375Longest build steps:
376 0.1 weighted s to build obj/base/base/trace_log.obj (6.7 s elapsed time)
377 0.2 weighted s to build nasm.exe, nasm.exe.pdb (0.2 s elapsed time)
378 0.3 weighted s to build obj/base/base/win_util.obj (12.4 s elapsed time)
379 1.2 weighted s to build base.dll, base.dll.lib (1.2 s elapsed time)
380Time by build-step type:
381 0.0 s weighted time to generate 6 .lib files (0.3 s elapsed time sum)
382 0.1 s weighted time to generate 25 .stamp files (1.2 s elapsed time sum)
383 0.2 s weighted time to generate 20 .o files (2.8 s elapsed time sum)
384 1.7 s weighted time to generate 4 PEFile (linking) files (2.0 s elapsed
385time sum)
386 23.9 s weighted time to generate 770 .obj files (974.8 s elapsed time sum)
38726.1 s weighted time (982.9 s elapsed time sum, 37.7x parallelism)
388839 build steps completed, average of 32.17/s
Bruce Dawsone9f20fff2018-03-03 01:58:38389```
390
Bruce Dawson2721f0b2019-11-08 18:41:27391The "weighted" time is the elapsed time of each build step divided by the number
392of tasks that were running in parallel. This makes it an excellent approximation
393of how "important" a slow step was. A link that is entirely or mostly serialized
394will have a weighted time that is the same or similar to its elapsed time. A
395compile that runs in parallel with 999 other compiles will have a weighted time
396that is tiny.
397
Bruce Dawson0bbe2d42018-03-06 19:45:55398You can also generate these reports by manually running the script after a build:
399
400```shell
401$ python depot_tools\post_build_ninja_summary.py -C out\Default
402```
403
Bruce Dawsonb9988e92019-09-16 17:01:10404Finally, setting ``NINJA_SUMMARIZE_BUILD=1`` tells autoninja to tell Ninja to
405report on its own overhead by passing "-d stats". This can be helpful if, for
406instance, process creation (which shows up in the StartEdge metric) is making
407builds slow, perhaps due to antivirus interference due to clang-cl not being in
408an excluded directory:
Bruce Dawsone9f20fff2018-03-03 01:58:38409
410```shell
Bruce Dawsonb9988e92019-09-16 17:01:10411$ set NINJA_SUMMARIZE_BUILD=1
412$ autoninja -C out\Default base
Bruce Dawsone9f20fff2018-03-03 01:58:38413metric count avg (us) total (ms)
414.ninja parse 3555 1539.4 5472.6
415canonicalize str 1383032 0.0 12.7
416canonicalize path 1402349 0.0 11.2
417lookup node 1398245 0.0 8.1
418.ninja_log load 2 118.0 0.2
419.ninja_deps load 2 67.5 0.1
420node stat 2516 29.6 74.4
421depfile load 2 1132.0 2.3
422StartEdge 88 3508.1 308.7
423FinishCommand 87 1670.9 145.4
424CLParser::Parse 45 1889.1 85.0
425```
426
Bruce Dawsonb9988e92019-09-16 17:01:10427You can also get a visual report of the build performance with
428[ninjatracing](https://github.com/nico/ninjatracing). This converts the
Chunbo Huaea6a9cf2022-07-20 03:01:10429.ninja_log file into a .json file which can be loaded into [chrome://tracing](chrome://tracing):
Bruce Dawsonb9988e92019-09-16 17:01:10430
431```shell
432$ python ninjatracing out\Default\.ninja_log >build.json
433```
434
dpranke0ae7cad2016-11-30 07:47:58435## Build Chromium
436
Max Morozf5b31fcd2018-08-10 21:55:48437Build Chromium (the "chrome" target) with Ninja using the command:
dpranke0ae7cad2016-11-30 07:47:58438
dpranke1a70d0c2016-12-01 02:42:29439```shell
Max Morozf5b31fcd2018-08-10 21:55:48440$ autoninja -C out\Default chrome
dpranke1a70d0c2016-12-01 02:42:29441```
dpranke0ae7cad2016-11-30 07:47:58442
Max Morozf5b31fcd2018-08-10 21:55:48443`autoninja` is a wrapper that automatically provides optimal values for the
444arguments passed to `ninja`.
445
dpranke0ae7cad2016-11-30 07:47:58446You can get a list of all of the other build targets from GN by running
Andrew Williamsfa9b7d62023-03-20 15:48:28447`gn ls out\Default` from the command line. To compile one, pass to Ninja
dpranke0ae7cad2016-11-30 07:47:58448the GN label with no preceding "//" (so for `//chrome/test:unit_tests`
Andrew Williamsfa9b7d62023-03-20 15:48:28449use `autoninja -C out\Default chrome/test:unit_tests`).
dpranke0ae7cad2016-11-30 07:47:58450
Junji Watanabedb7caa62024-04-22 08:15:34451## Compile a single file
452
Lalit Rana8bd378e2024-08-19 19:34:37453Ninja supports a special [syntax `^`][ninja hat syntax] to compile a single
454object file specifying the source file. For example, `ninja -C
455out/Default ../../base/logging.cc^` compiles `obj/base/base/logging.o`.
Junji Watanabedb7caa62024-04-22 08:15:34456
457[ninja hat syntax]: https://ninja-build.org/manual.html#:~:text=There%20is%20also%20a%20special%20syntax%20target%5E%20for%20specifying%20a%20target%20as%20the%20first%20output%20of%20some%20rule%20containing%20the%20source%20you%20put%20in%20the%20command%20line%2C%20if%20one%20exists.%20For%20example%2C%20if%20you%20specify%20target%20as%20foo.c%5E%20then%20foo.o%20will%20get%20built%20(assuming%20you%20have%20those%20targets%20in%20your%20build%20files)
458
459With autoninja, you need to add `^^` to preserve the trailing `^`.
460
461```shell
462$ autoninja -C out\Default ..\..\base\logging.cc^^
463```
464
465In addition to `foo.cc^^`, Siso also supports `foo.h^^` syntax to compile
466the corresponding `foo.o` if it exists.
467
Peter Kastinga8ddeee2024-08-09 08:42:33468If you run a `bash` shell, you can use the following script to ease invocation:
469
470```shell
471#!/bin/sh
472files=("${@/#/..\/..\/}")
473autoninja -C out/Default ${files[@]/%/^^}
474```
475
476This script assumes it is run from `src` and your output dir is `out/Default`;
477it invokes `autoninja` to compile all given files. If you place it in your
478`$PATH` and name it e.g. `compile`, you can invoke like this:
479
480```shell
481$ pwd # Just to illustrate where this is run from
482/c/src
483$ compile base/time/time.cc base/time/time_unittest.cc
484...
485[0/47] 5.56s S CXX obj/base/base/time.obj
486...
487[2/3] 9.27s S CXX obj/base/base_unittests/time_unittest.obj
488...
489```
490
dpranke0ae7cad2016-11-30 07:47:58491## Run Chromium
492
493Once it is built, you can simply run the browser:
494
dpranke1a70d0c2016-12-01 02:42:29495```shell
496$ out\Default\chrome.exe
497```
498
499(The ".exe" suffix in the command is actually optional).
dpranke0ae7cad2016-11-30 07:47:58500
501## Running test targets
502
Andrew Williamsfa9b7d62023-03-20 15:48:28503Tests are split into multiple test targets based on their type and where they
504exist in the directory structure. To see what target a given unit test or
505browser test file corresponds to, the following command can be used:
dpranke0ae7cad2016-11-30 07:47:58506
dpranke1a70d0c2016-12-01 02:42:29507```shell
Andrew Williamsfa9b7d62023-03-20 15:48:28508$ gn refs out\Default --testonly=true --type=executable --all chrome\browser\ui\browser_list_unittest.cc
509//chrome/test:unit_tests
510```
511
512In the example above, the target is unit_tests. The unit_tests binary can be
513built by running the following command:
514
515```shell
516$ autoninja -C out\Default unit_tests
517```
518
519You can run the tests by running the unit_tests binary. You can also limit which
520tests are run using the `--gtest_filter` arg, e.g.:
521
522```shell
523$ out\Default\unit_tests.exe --gtest_filter="BrowserListUnitTest.*"
dpranke1a70d0c2016-12-01 02:42:29524```
dpranke0ae7cad2016-11-30 07:47:58525
526You can find out more about GoogleTest at its
527[GitHub page](https://github.com/google/googletest).
528
Greg Thompson530c2a92024-07-16 14:03:33529## Build an Installer
530
531Build the `mini_installer` target to create a self-contained installer. This
532has everything needed to install your browser on a machine.
533
534```shell
535$ autoninja -C out\Default mini_installer
536```
537
538See [//chrome/installer/setup/README.md](../chrome/installer/setup/README.md)
539and [//chrome/installer/mini_installer/README.md](../chrome/installer/mini_installer/README.md)
540for more information.
541
dpranke0ae7cad2016-11-30 07:47:58542## Update your checkout
543
544To update an existing checkout, you can run
545
dpranke1a70d0c2016-12-01 02:42:29546```shell
547$ git rebase-update
Bruce Dawsonef0b5452020-10-03 00:13:09548$ gclient sync -D
dpranke1a70d0c2016-12-01 02:42:29549```
dpranke0ae7cad2016-11-30 07:47:58550
551The first command updates the primary Chromium source repository and rebases
Andrew Williamsbbc1a1e2021-07-21 01:51:22552any of your local branches on top of tip-of-tree (aka the Git branch
553`origin/main`). If you don't want to use this script, you can also just use
554`git pull` or other common Git commands to update the repo.
dpranke0ae7cad2016-11-30 07:47:58555
Bruce Dawsonef0b5452020-10-03 00:13:09556The second command syncs the subrepositories to the appropriate versions,
557deleting those that are no longer needed, and re-runs the hooks as needed.
558
559### Editing and Debugging With the Visual Studio IDE
560
561You can use the Visual Studio IDE to edit and debug Chrome, with or without
562Intellisense support.
563
564#### Using Visual Studio Intellisense
565
566If you want to use Visual Studio Intellisense when developing Chromium, use the
567`--ide` command line argument to `gn gen` when you generate your output
568directory (as described on the [get the code](https://dev.chromium.org/developers/how-tos/get-the-code)
Junji Watanabe0f6489c72023-02-01 04:02:11569page). This is an example when your checkout is `C:\src\chromium` and your
570output directory is `out\Default`:
Bruce Dawsonef0b5452020-10-03 00:13:09571
572```shell
Junji Watanabe0f6489c72023-02-01 04:02:11573$ gn gen --ide=vs --ninja-executable=C:\src\chromium\src\third_party\ninja\ninja.exe out\Default
Bruce Dawsonef0b5452020-10-03 00:13:09574$ devenv out\Default\all.sln
575```
576
577GN will produce a file `all.sln` in your build directory. It will internally
578use Ninja to compile while still allowing most IDE functions to work (there is
579no native Visual Studio compilation mode). If you manually run "gen" again you
580will need to resupply this argument, but normally GN will keep the build and
581IDE files up to date automatically when you build.
582
583The generated solution will contain several thousand projects and will be very
584slow to load. Use the `--filters` argument to restrict generating project files
585for only the code you're interested in. Although this will also limit what
586files appear in the project explorer, debugging will still work and you can
587set breakpoints in files that you open manually. A minimal solution that will
588let you compile and run Chrome in the IDE but will not show any source files
589is:
590
591```
Junji Watanabe0f6489c72023-02-01 04:02:11592$ gn gen --ide=vs --ninja-executable=C:\src\chromium\src\third_party\ninja\ninja.exe --filters=//chrome --no-deps out\Default
Bruce Dawsonef0b5452020-10-03 00:13:09593```
594
595You can selectively add other directories you care about to the filter like so:
596`--filters=//chrome;//third_party/WebKit/*;//gpu/*`.
597
598There are other options for controlling how the solution is generated, run `gn
599help gen` for the current documentation.
600
601#### Using Visual Studio without Intellisense
602
603It is also possible to debug and develop Chrome in Visual Studio without the
604overhead of a multi-project solution file. Simply "open" your chrome.exe binary
605with `File->Open->Project/Solution`, or from a Visual Studio command prompt like
606so: `devenv /debugexe out\Debug\chrome.exe <your arguments>`. Many of Visual
607Studio's code exploration features will not work in this configuration, but by
608installing the [VsChromium Visual Studio Extension](https://chromium.github.io/vs-chromium/)
609you can get the source code to appear in the solution explorer window along
610with other useful features such as code search. You can add multiple executables
611of interest (base_unittests.exe, browser_tests.exe) to your solution with
612`File->Add->Existing Project...` and change which one will be debugged by
613right-clicking on them in `Solution Explorer` and selecting `Set as Startup
614Project`. You can also change their properties, including command line
615arguments, by right-clicking on them in `Solution Explorer` and selecting
616`Properties`.
617
618By default when you start debugging in Visual Studio the debugger will only
619attach to the main browser process. To debug all of Chrome, install
620[Microsoft's Child Process Debugging Power Tool](https://blogs.msdn.microsoft.com/devops/2014/11/24/introducing-the-child-process-debugging-power-tool/).
621You will also need to run Visual Studio as administrator, or it will silently
622fail to attach to some of Chrome's child processes.
623
Bruce Dawson425d4ab2023-06-25 01:36:15624### Improving performance of git commands
Avi Drissmanc0f6793ac2023-05-26 19:22:44625
626#### Configure git to use an untracked cache
627
Bruce Dawson2154274a2023-06-17 22:24:29628Try running
Avi Drissmanc0f6793ac2023-05-26 19:22:44629
630```shell
631$ git update-index --test-untracked-cache
632```
633
634If the output ends with `OK`, then the following may also improve performance of
635`git status`:
636
637```shell
638$ git config core.untrackedCache true
639```
640
Avi Drissmanc0f6793ac2023-05-26 19:22:44641#### Configure git to use fsmonitor
642
Bruce Dawson2154274a2023-06-17 22:24:29643You can significantly speed up git by using [fsmonitor.](https://github.blog/2022-06-29-improve-git-monorepo-performance-with-a-file-system-monitor/)
644You should enable fsmonitor in large repos, such as Chromium and v8. Enabling
645it globally will launch many processes and consume excess commit/memory and
646probably isn't worthwhile. The command to enable fsmonitor in the current repo
647is:
Avi Drissmanc0f6793ac2023-05-26 19:22:44648
649```shell
650$ git config core.fsmonitor true
651```