blob: f975bfc7a80f550d5cfcfdd048cb1bc4dd0bbb0d [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
15* A 64-bit Intel machine with at least 8GB of RAM. More than 16GB is highly
16 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
Aaron Gable7a173b7a2020-01-02 17:13:2426Chromium requires Visual Studio 2017 (>=15.7.2) to build, but VS2019 (>=16.0.0)
27is preferred. Visual Studio can also be used to debug Chromium, and VS2019 is
Bruce Dawsonfa551102019-06-11 23:50:0428preferred for this as it handles Chromium's large debug information much better.
Raul Tambre1bb5c1a2018-12-29 00:57:1229The clang-cl compiler is used but Visual Studio's header files, libraries, and
30some tools are required. Visual Studio Community Edition should work if its
31license is appropriate for you. You must install the "Desktop development with
32C++" component and the "MFC/ATL support" sub-components. This can be done from
33the command line by passing these arguments to the Visual Studio installer (see
34below for ARM64 instructions):
Bruce Dawson1c0979a62017-09-13 17:47:2135```shell
Bruce Dawsone42d7642018-12-10 23:50:0036$ PATH_TO_INSTALLER.EXE ^
37--add Microsoft.VisualStudio.Workload.NativeDesktop ^
38--add Microsoft.VisualStudio.Component.VC.ATLMFC ^
39--includeRecommended
Bruce Dawson1c0979a62017-09-13 17:47:2140```
pwnall43b43ba2016-08-22 19:29:2941
Bruce Dawsone42d7642018-12-10 23:50:0042If you want to build for ARM64 Win32 then some extra arguments are needed. The
43full set for that case is:
44```shell
45$ PATH_TO_INSTALLER.EXE ^
46--add Microsoft.VisualStudio.Workload.NativeDesktop ^
47--add Microsoft.VisualStudio.Component.VC.ATLMFC ^
48--add Microsoft.VisualStudio.Component.VC.Tools.ARM64 ^
49--add Microsoft.VisualStudio.Component.VC.MFC.ARM64 ^
50--includeRecommended
51```
52
Chunbo Huac76a7b22020-07-02 02:21:0053You must have the version 10.0.19041 or higher Windows 10 SDK installed. This
Bruce Dawsone42d7642018-12-10 23:50:0054can be installed separately or by checking the appropriate box in the Visual
55Studio Installer.
Bruce Dawsone9f20fff2018-03-03 01:58:3856
57The SDK Debugging Tools must also be installed. If the Windows 10 SDK was
58installed via the Visual Studio installer, then they can be installed by going
59to: Control Panel → Programs → Programs and Features → Select the "Windows
60Software Development Kit" → Change → Change → Check "Debugging Tools For
61Windows" → Change. Or, you can download the standalone SDK installer and use it
62to install the Debugging Tools.
Robert Sesekc8ffa1b2017-08-04 19:55:2263
dpranke0ae7cad2016-11-30 07:47:5864## Install `depot_tools`
tfarina502f3882016-03-23 12:48:1065
dpranke1a70d0c2016-12-01 02:42:2966Download the [depot_tools bundle](https://storage.googleapis.com/chrome-infra/depot_tools.zip)
dpranke0ae7cad2016-11-30 07:47:5867and extract it somewhere.
tfarina502f3882016-03-23 12:48:1068
dpranke0ae7cad2016-11-30 07:47:5869*** note
70**Warning:** **DO NOT** use drag-n-drop or copy-n-paste extract from Explorer,
71this will not extract the hidden “.git” folder which is necessary for
Bruce Dawson4d1de592017-09-08 00:24:0072depot_tools to autoupdate itself. You can use “Extract all…” from the
dpranke0ae7cad2016-11-30 07:47:5873context menu though.
74***
tfarina502f3882016-03-23 12:48:1075
Bruce Dawson4d1de592017-09-08 00:24:0076Add depot_tools to the start of your PATH (must be ahead of any installs of
dpranke4b470c5b2017-01-19 17:38:0477Python). Assuming you unzipped the bundle to C:\src\depot_tools, open:
tfarina502f3882016-03-23 12:48:1078
dpranke0ae7cad2016-11-30 07:47:5879Control Panel → System and Security → System → Advanced system settings
tfarina502f3882016-03-23 12:48:1080
dpranke4b470c5b2017-01-19 17:38:0481If you have Administrator access, Modify the PATH system variable and
82put `C:\src\depot_tools` at the front (or at least in front of any directory
83that might already have a copy of Python or Git).
tfarina502f3882016-03-23 12:48:1084
dpranke4b470c5b2017-01-19 17:38:0485If you don't have Administrator access, you can add a user-level PATH
86environment variable and put `C:\src\depot_tools` at the front, but
87if your system PATH has a Python in it, you will be out of luck.
dpranke0ae7cad2016-11-30 07:47:5888
89Also, add a DEPOT_TOOLS_WIN_TOOLCHAIN system variable in the same way, and set
90it to 0. This tells depot_tools to use your locally installed version of Visual
Aaron Gabledad9e0f2020-01-09 19:38:5291Studio (by default, depot_tools will try to use a google-internal version).
dpranke0ae7cad2016-11-30 07:47:5892
Andreas Papacharalampous1d22c9612020-06-13 23:11:1793You may also have to set variable `vs2017_install` or `vs2019_install` to your
94installation path of Visual Studio 2017 or 19, like
95`set vs2019_install=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional`
96for Visual Studio 2019.
97
dpranke0ae7cad2016-11-30 07:47:5898From a cmd.exe shell, run the command gclient (without arguments). On first
99run, gclient will install all the Windows-specific bits needed to work with
100the code, including msysgit and python.
101
102* If you run gclient from a non-cmd shell (e.g., cygwin, PowerShell),
103 it may appear to run properly, but msysgit, python, and other tools
104 may not get installed correctly.
105* If you see strange errors with the file system on the first run of gclient,
106 you may want to [disable Windows Indexing](http://tortoisesvn.tigris.org/faq.html#cantmove2).
107
Will Harris1c8f89c2021-03-08 22:53:43108## Check python install
109
Bruce Dawson4d1de592017-09-08 00:24:00110After running gclient open a command prompt and type `where python` and
111confirm that the depot_tools `python.bat` comes ahead of any copies of
112python.exe. Failing to ensure this can lead to overbuilding when
dpranke0ae7cad2016-11-30 07:47:58113using gn - see [crbug.com/611087](https://crbug.com/611087).
114
Will Harris1c8f89c2021-03-08 22:53:43115[App Execution Aliases](https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/desktop-to-uwp-extensions#alias)
116can conflict with other installations of python on the system so disable
117these for 'python.exe' and 'python3.exe' by opening 'App execution aliases'
118section of Control Panel and unticking the boxes next to both of these
119that point to 'App Installer'.
120
dpranke0ae7cad2016-11-30 07:47:58121## Get the code
122
Leonard Mosescu718c9ac2017-06-20 18:06:32123First, configure Git:
124
125```shell
126$ git config --global user.name "My Name"
127$ git config --global user.email "[email protected]"
128$ git config --global core.autocrlf false
129$ git config --global core.filemode false
130$ git config --global branch.autosetuprebase always
131```
132
sdy93387fa2016-12-01 01:03:44133Create a `chromium` directory for the checkout and change to it (you can call
dpranke0ae7cad2016-11-30 07:47:58134this whatever you like and put it wherever you like, as
135long as the full path has no spaces):
dpranke0ae7cad2016-11-30 07:47:58136
sdy93387fa2016-12-01 01:03:44137```shell
138$ mkdir chromium && cd chromium
139```
140
141Run the `fetch` tool from `depot_tools` to check out the code and its
dpranke0ae7cad2016-11-30 07:47:58142dependencies.
143
sdy93387fa2016-12-01 01:03:44144```shell
xiaoyin.l802e4b3e2016-12-04 22:17:30145$ fetch chromium
sdy93387fa2016-12-01 01:03:44146```
dpranke0ae7cad2016-11-30 07:47:58147
148If you don't want the full repo history, you can save a lot of time by
sdy93387fa2016-12-01 01:03:44149adding the `--no-history` flag to `fetch`.
dpranke0ae7cad2016-11-30 07:47:58150
sdy93387fa2016-12-01 01:03:44151Expect the command to take 30 minutes on even a fast connection, and many
152hours on slower ones.
dpranke0ae7cad2016-11-30 07:47:58153
sdy93387fa2016-12-01 01:03:44154When `fetch` completes, it will have created a hidden `.gclient` file and a
155directory called `src` in the working directory. The remaining instructions
156assume you have switched to the `src` directory:
dpranke0ae7cad2016-11-30 07:47:58157
sdy93387fa2016-12-01 01:03:44158```shell
159$ cd src
160```
dpranke0ae7cad2016-11-30 07:47:58161
sdy93387fa2016-12-01 01:03:44162*Optional*: You can also [install API
163keys](https://www.chromium.org/developers/how-tos/api-keys) if you want your
164build to talk to some Google services, but this is not necessary for most
165development and testing purposes.
dpranke0ae7cad2016-11-30 07:47:58166
dpranke1a70d0c2016-12-01 02:42:29167## Setting up the build
dpranke0ae7cad2016-11-30 07:47:58168
Tom Bridgwatereef401542018-08-17 00:54:43169Chromium uses [Ninja](https://ninja-build.org) as its main build tool along with
Andrew Williamsbbc1a1e2021-07-21 01:51:22170a tool called [GN](https://gn.googlesource.com/gn/+/main/docs/quick_start.md)
Tom Bridgwatereef401542018-08-17 00:54:43171to generate `.ninja` files. You can create any number of *build directories*
172with different configurations. To create a build directory:
dpranke0ae7cad2016-11-30 07:47:58173
sdy93387fa2016-12-01 01:03:44174```shell
175$ gn gen out/Default
176```
dpranke0ae7cad2016-11-30 07:47:58177
sdy93387fa2016-12-01 01:03:44178* You only have to run this once for each new build directory, Ninja will
179 update the build files as needed.
180* You can replace `Default` with another name, but
181 it should be a subdirectory of `out`.
Aaron Gabledad9e0f2020-01-09 19:38:52182* For other build arguments, including release settings or using an alternate
183 version of Visual Studio, see [GN build
sdy93387fa2016-12-01 01:03:44184 configuration](https://www.chromium.org/developers/gn-build-configuration).
dpranke0ae7cad2016-11-30 07:47:58185 The default will be a debug component build matching the current host
186 operating system and CPU.
Tom Bridgwatereef401542018-08-17 00:54:43187* For more info on GN, run `gn help` on the command line or read the [quick
Andrew Williamsbbc1a1e2021-07-21 01:51:22188 start guide](https://gn.googlesource.com/gn/+/main/docs/quick_start.md).
Juan Cruz Viotti9c7622d2021-06-30 00:27:23189
dpranke0ae7cad2016-11-30 07:47:58190### Faster builds
tfarina502f3882016-03-23 12:48:10191
dpranke0ae7cad2016-11-30 07:47:58192* Reduce file system overhead by excluding build directories from
193 antivirus and indexing software.
194* Store the build tree on a fast disk (preferably SSD).
brucedawsoncfc7fd52017-07-06 18:41:01195* The more cores the better (20+ is not excessive) and lots of RAM is needed
196(64 GB is not excessive).
tfarina502f3882016-03-23 12:48:10197
brucedawsoncfc7fd52017-07-06 18:41:01198There are some gn flags that can improve build speeds. You can specify these
199in the editor that appears when you create your output directory
200(`gn args out/Default`) or on the gn gen command line
201(`gn gen out/Default --args="is_component_build = true is_debug = true"`).
202Some helpful settings to consider using include:
203* `is_component_build = true` - this uses more, smaller DLLs, and incremental
204linking.
Bruce Dawsonfcd3deb12017-07-28 17:12:20205* `enable_nacl = false` - this disables Native Client which is usually not
206needed for local builds.
brucedawsoncfc7fd52017-07-06 18:41:01207* `target_cpu = "x86"` - x86 builds are slightly faster than x64 builds and
208support incremental linking for more targets. Note that if you set this but
Bruce Dawsonfcd3deb12017-07-28 17:12:20209don't' set enable_nacl = false then build times may get worse.
James Cook26699a92019-03-12 22:23:10210* `blink_symbol_level = 0` - turn off source-level debugging for
brucedawsoncfc7fd52017-07-06 18:41:01211blink to reduce build times, appropriate if you don't plan to debug blink.
brucedawsoncfc7fd52017-07-06 18:41:01212
Bruce Dawson817f47fb2020-05-01 22:29:08213In order to speed up linking you can set `symbol_level = 1` or
214`symbol_level = 0` - these options reduce the work the compiler and linker have
215to do. With `symbol_level = 1` the compiler emits file name and line number
216information so you can still do source-level debugging but there will be no
217local variable or type information. With `symbol_level = 0` there is no
218source-level debugging but call stacks still have function names. Changing
219`symbol_level` requires recompiling everything.
brucedawsoncfc7fd52017-07-06 18:41:01220
Bruce Dawsone9f20fff2018-03-03 01:58:38221In addition, Google employees should use goma, a distributed compilation system.
222Detailed information is available internally but the relevant gn arg is:
223* `use_goma = true`
brucedawsoncfc7fd52017-07-06 18:41:01224
225To get any benefit from goma it is important to pass a large -j value to ninja.
Bruce Dawsone9f20fff2018-03-03 01:58:38226A good default is 10\*numCores to 20\*numCores. If you run autoninja then it
227will automatically pass an appropriate -j value to ninja for goma or not.
228
229```shell
230$ autoninja -C out\Default chrome
231```
brucedawsoncfc7fd52017-07-06 18:41:01232
233When invoking ninja specify 'chrome' as the target to avoid building all test
234binaries as well.
235
236Still, builds will take many hours on many machines.
dpranke0ae7cad2016-11-30 07:47:58237
Juan Cruz Viotti9c7622d2021-06-30 00:27:23238#### Use SCCACHE
239
240You might be able to use [sccache](https://github.com/mozilla/sccache) for the
241build process by enabling the following arguments:
242
243* `cc_wrapper = "sccache"` - assuming the `sccache` binary is in your `%PATH%`
244* `chrome_pgo_phase = 0`
245
Bruce Dawsone9f20fff2018-03-03 01:58:38246### Why is my build slow?
247
248Many things can make builds slow, with Windows Defender slowing process startups
249being a frequent culprit. Have you ensured that the entire Chromium src
Bruce Dawson0bbe2d42018-03-06 19:45:55250directory is excluded from antivirus scanning (on Google machines this means
Bruce Dawsone9f20fff2018-03-03 01:58:38251putting it in a ``src`` directory in the root of a drive)? Have you tried the
252different settings listed above, including different link settings and -j
253values? Have you asked on the chromium-dev mailing list to see if your build is
254slower than expected for your machine's specifications?
255
Bruce Dawson89390172019-05-08 09:51:18256The next step is to gather some data. If you set the ``NINJA_SUMMARIZE_BUILD``
Bruce Dawsonb9988e92019-09-16 17:01:10257environment variable to 1 then ``autoninja`` will do three things. First, it
258will set the [NINJA_STATUS](https://ninja-build.org/manual.html#_environment_variables)
Bruce Dawson89390172019-05-08 09:51:18259environment variable so that ninja will print additional information while
260building Chrome. It will show how many build processes are running at any given
261time, how many build steps have completed, how many build steps have completed
262per second, and how long the build has been running, as shown here:
Bruce Dawsone9f20fff2018-03-03 01:58:38263
264```shell
Bruce Dawson89390172019-05-08 09:51:18265$ set NINJA_SUMMARIZE_BUILD=1
Bruce Dawsone9f20fff2018-03-03 01:58:38266$ autoninja -C out\Default base
267ninja: Entering directory `out\Default'
268[1 processes, 86/86 @ 2.7/s : 31.785s ] LINK(DLL) base.dll base.dll.lib base.dll.pdb
269```
270
Bruce Dawson89390172019-05-08 09:51:18271This makes slow process creation immediately obvious and lets you tell quickly
272if a build is running more slowly than normal.
273
274In addition, setting ``NINJA_SUMMARIZE_BUILD=1`` tells ``autoninja`` to print a
275build performance summary when the build completes, showing the slowest build
276steps and slowest build-step types, as shown here:
Bruce Dawsone9f20fff2018-03-03 01:58:38277
278```shell
279$ set NINJA_SUMMARIZE_BUILD=1
280$ autoninja -C out\Default base
Bruce Dawson2721f0b2019-11-08 18:41:27281Longest build steps:
282 0.1 weighted s to build obj/base/base/trace_log.obj (6.7 s elapsed time)
283 0.2 weighted s to build nasm.exe, nasm.exe.pdb (0.2 s elapsed time)
284 0.3 weighted s to build obj/base/base/win_util.obj (12.4 s elapsed time)
285 1.2 weighted s to build base.dll, base.dll.lib (1.2 s elapsed time)
286Time by build-step type:
287 0.0 s weighted time to generate 6 .lib files (0.3 s elapsed time sum)
288 0.1 s weighted time to generate 25 .stamp files (1.2 s elapsed time sum)
289 0.2 s weighted time to generate 20 .o files (2.8 s elapsed time sum)
290 1.7 s weighted time to generate 4 PEFile (linking) files (2.0 s elapsed
291time sum)
292 23.9 s weighted time to generate 770 .obj files (974.8 s elapsed time sum)
29326.1 s weighted time (982.9 s elapsed time sum, 37.7x parallelism)
294839 build steps completed, average of 32.17/s
Bruce Dawsone9f20fff2018-03-03 01:58:38295```
296
Bruce Dawson2721f0b2019-11-08 18:41:27297The "weighted" time is the elapsed time of each build step divided by the number
298of tasks that were running in parallel. This makes it an excellent approximation
299of how "important" a slow step was. A link that is entirely or mostly serialized
300will have a weighted time that is the same or similar to its elapsed time. A
301compile that runs in parallel with 999 other compiles will have a weighted time
302that is tiny.
303
Bruce Dawson0bbe2d42018-03-06 19:45:55304You can also generate these reports by manually running the script after a build:
305
306```shell
307$ python depot_tools\post_build_ninja_summary.py -C out\Default
308```
309
Bruce Dawsonb9988e92019-09-16 17:01:10310Finally, setting ``NINJA_SUMMARIZE_BUILD=1`` tells autoninja to tell Ninja to
311report on its own overhead by passing "-d stats". This can be helpful if, for
312instance, process creation (which shows up in the StartEdge metric) is making
313builds slow, perhaps due to antivirus interference due to clang-cl not being in
314an excluded directory:
Bruce Dawsone9f20fff2018-03-03 01:58:38315
316```shell
Bruce Dawsonb9988e92019-09-16 17:01:10317$ set NINJA_SUMMARIZE_BUILD=1
318$ autoninja -C out\Default base
319"c:\src\depot_tools\ninja.exe" -C out\Default base -j 10 -d stats
Bruce Dawsone9f20fff2018-03-03 01:58:38320metric count avg (us) total (ms)
321.ninja parse 3555 1539.4 5472.6
322canonicalize str 1383032 0.0 12.7
323canonicalize path 1402349 0.0 11.2
324lookup node 1398245 0.0 8.1
325.ninja_log load 2 118.0 0.2
326.ninja_deps load 2 67.5 0.1
327node stat 2516 29.6 74.4
328depfile load 2 1132.0 2.3
329StartEdge 88 3508.1 308.7
330FinishCommand 87 1670.9 145.4
331CLParser::Parse 45 1889.1 85.0
332```
333
Bruce Dawsonb9988e92019-09-16 17:01:10334You can also get a visual report of the build performance with
335[ninjatracing](https://github.com/nico/ninjatracing). This converts the
336.ninja_log file into a .json file which can be loaded into chrome://tracing:
337
338```shell
339$ python ninjatracing out\Default\.ninja_log >build.json
340```
341
dpranke0ae7cad2016-11-30 07:47:58342## Build Chromium
343
Max Morozf5b31fcd2018-08-10 21:55:48344Build Chromium (the "chrome" target) with Ninja using the command:
dpranke0ae7cad2016-11-30 07:47:58345
dpranke1a70d0c2016-12-01 02:42:29346```shell
Max Morozf5b31fcd2018-08-10 21:55:48347$ autoninja -C out\Default chrome
dpranke1a70d0c2016-12-01 02:42:29348```
dpranke0ae7cad2016-11-30 07:47:58349
Max Morozf5b31fcd2018-08-10 21:55:48350`autoninja` is a wrapper that automatically provides optimal values for the
351arguments passed to `ninja`.
352
dpranke0ae7cad2016-11-30 07:47:58353You can get a list of all of the other build targets from GN by running
354`gn ls out/Default` from the command line. To compile one, pass to Ninja
355the GN label with no preceding "//" (so for `//chrome/test:unit_tests`
356use ninja -C out/Default chrome/test:unit_tests`).
357
358## Run Chromium
359
360Once it is built, you can simply run the browser:
361
dpranke1a70d0c2016-12-01 02:42:29362```shell
363$ out\Default\chrome.exe
364```
365
366(The ".exe" suffix in the command is actually optional).
dpranke0ae7cad2016-11-30 07:47:58367
368## Running test targets
369
370You can run the tests in the same way. You can also limit which tests are
371run using the `--gtest_filter` arg, e.g.:
372
dpranke1a70d0c2016-12-01 02:42:29373```shell
374$ out\Default\unit_tests.exe --gtest_filter="PushClientTest.*"
375```
dpranke0ae7cad2016-11-30 07:47:58376
377You can find out more about GoogleTest at its
378[GitHub page](https://github.com/google/googletest).
379
380## Update your checkout
381
382To update an existing checkout, you can run
383
dpranke1a70d0c2016-12-01 02:42:29384```shell
385$ git rebase-update
Bruce Dawsonef0b5452020-10-03 00:13:09386$ gclient sync -D
dpranke1a70d0c2016-12-01 02:42:29387```
dpranke0ae7cad2016-11-30 07:47:58388
389The first command updates the primary Chromium source repository and rebases
Andrew Williamsbbc1a1e2021-07-21 01:51:22390any of your local branches on top of tip-of-tree (aka the Git branch
391`origin/main`). If you don't want to use this script, you can also just use
392`git pull` or other common Git commands to update the repo.
dpranke0ae7cad2016-11-30 07:47:58393
Bruce Dawsonef0b5452020-10-03 00:13:09394The second command syncs the subrepositories to the appropriate versions,
395deleting those that are no longer needed, and re-runs the hooks as needed.
396
397### Editing and Debugging With the Visual Studio IDE
398
399You can use the Visual Studio IDE to edit and debug Chrome, with or without
400Intellisense support.
401
402#### Using Visual Studio Intellisense
403
404If you want to use Visual Studio Intellisense when developing Chromium, use the
405`--ide` command line argument to `gn gen` when you generate your output
406directory (as described on the [get the code](https://dev.chromium.org/developers/how-tos/get-the-code)
407page):
408
409```shell
410$ gn gen --ide=vs out\Default
411$ devenv out\Default\all.sln
412```
413
414GN will produce a file `all.sln` in your build directory. It will internally
415use Ninja to compile while still allowing most IDE functions to work (there is
416no native Visual Studio compilation mode). If you manually run "gen" again you
417will need to resupply this argument, but normally GN will keep the build and
418IDE files up to date automatically when you build.
419
420The generated solution will contain several thousand projects and will be very
421slow to load. Use the `--filters` argument to restrict generating project files
422for only the code you're interested in. Although this will also limit what
423files appear in the project explorer, debugging will still work and you can
424set breakpoints in files that you open manually. A minimal solution that will
425let you compile and run Chrome in the IDE but will not show any source files
426is:
427
428```
429$ gn gen --ide=vs --filters=//chrome --no-deps out\Default
430```
431
432You can selectively add other directories you care about to the filter like so:
433`--filters=//chrome;//third_party/WebKit/*;//gpu/*`.
434
435There are other options for controlling how the solution is generated, run `gn
436help gen` for the current documentation.
437
438#### Using Visual Studio without Intellisense
439
440It is also possible to debug and develop Chrome in Visual Studio without the
441overhead of a multi-project solution file. Simply "open" your chrome.exe binary
442with `File->Open->Project/Solution`, or from a Visual Studio command prompt like
443so: `devenv /debugexe out\Debug\chrome.exe <your arguments>`. Many of Visual
444Studio's code exploration features will not work in this configuration, but by
445installing the [VsChromium Visual Studio Extension](https://chromium.github.io/vs-chromium/)
446you can get the source code to appear in the solution explorer window along
447with other useful features such as code search. You can add multiple executables
448of interest (base_unittests.exe, browser_tests.exe) to your solution with
449`File->Add->Existing Project...` and change which one will be debugged by
450right-clicking on them in `Solution Explorer` and selecting `Set as Startup
451Project`. You can also change their properties, including command line
452arguments, by right-clicking on them in `Solution Explorer` and selecting
453`Properties`.
454
455By default when you start debugging in Visual Studio the debugger will only
456attach to the main browser process. To debug all of Chrome, install
457[Microsoft's Child Process Debugging Power Tool](https://blogs.msdn.microsoft.com/devops/2014/11/24/introducing-the-child-process-debugging-power-tool/).
458You will also need to run Visual Studio as administrator, or it will silently
459fail to attach to some of Chrome's child processes.
460