blob: 1f612d2b5a9db6dbf7a9bafb321f9b593596dc22 [file] [log] [blame] [view]
dpranke1a70d0c2016-12-01 02:42:291# Checking out and building Chromium for Mac
andybons3322f762015-08-24 21:37:092
erikchen7d7509a2017-10-02 23:40:363There are instructions for other platforms linked from the
dpranke1a70d0c2016-12-01 02:42:294[get the code](get_the_code.md) page.
5
dpranke1a70d0c2016-12-01 02:42:296## Instructions for Google Employees
7
8Are you a Google employee? See
9[go/building-chrome](https://goto.google.com/building-chrome) instead.
dpranke0ae7cad2016-11-30 07:47:5810
andybonsad92aa32015-08-31 02:27:4411[TOC]
andybons3322f762015-08-24 21:37:0912
dpranke0ae7cad2016-11-30 07:47:5813## System requirements
sdya8197bd22016-09-14 19:06:4214
erikchen7d7509a2017-10-02 23:40:3615* A 64-bit Mac running 10.12+.
16* [Xcode](https://developer.apple.com/xcode) 8+
17* The OS X 10.12 SDK. Run
sdy93387fa2016-12-01 01:03:4418
erikchen7d7509a2017-10-02 23:40:3619 ```shell
sdy93387fa2016-12-01 01:03:4420 $ ls `xcode-select -p`/Platforms/MacOSX.platform/Developer/SDKs
dominicca4e4c992016-05-23 22:08:0321 ```
erikchen7d7509a2017-10-02 23:40:3622
sdy93387fa2016-12-01 01:03:4423 to check whether you have it. Building with a newer SDK works too, but
erikchen7d7509a2017-10-02 23:40:3624 the releases currently use the 10.12 SDK.
andybons3322f762015-08-24 21:37:0925
dpranke0ae7cad2016-11-30 07:47:5826## Install `depot_tools`
andybons3322f762015-08-24 21:37:0927
sdy93387fa2016-12-01 01:03:4428Clone the `depot_tools` repository:
andybons3322f762015-08-24 21:37:0929
sdy93387fa2016-12-01 01:03:4430```shell
31$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
32```
andybons3322f762015-08-24 21:37:0933
sdy93387fa2016-12-01 01:03:4434Add `depot_tools` to the end of your PATH (you will probably want to put this
35in your `~/.bashrc` or `~/.zshrc`). Assuming you cloned `depot_tools` to
36`/path/to/depot_tools`:
dpranke0ae7cad2016-11-30 07:47:5837
sdy93387fa2016-12-01 01:03:4438```shell
39$ export PATH="$PATH:/path/to/depot_tools"
40```
dpranke0ae7cad2016-11-30 07:47:5841
42## Get the code
43
Aaron Gable94b7e2a32018-01-03 19:14:4144Ensure that unicode filenames aren't mangled by HFS:
45
46```shell
47$ git config --global core.precomposeUnicode true
48```
49
sdy93387fa2016-12-01 01:03:4450Create a `chromium` directory for the checkout and change to it (you can call
51this whatever you like and put it wherever you like, as long as the full path
52has no spaces):
dpranke0ae7cad2016-11-30 07:47:5853
sdy93387fa2016-12-01 01:03:4454```shell
55$ mkdir chromium && cd chromium
Aaron Gable94b7e2a32018-01-03 19:14:4156$ git config --global core.precomposeUnicode true
sdy93387fa2016-12-01 01:03:4457```
58
59Run the `fetch` tool from `depot_tools` to check out the code and its
dpranke0ae7cad2016-11-30 07:47:5860dependencies.
61
sdy93387fa2016-12-01 01:03:4462```shell
63$ fetch chromium
64```
dpranke0ae7cad2016-11-30 07:47:5865
66If you don't want the full repo history, you can save a lot of time by
sdy93387fa2016-12-01 01:03:4467adding the `--no-history` flag to `fetch`.
dpranke0ae7cad2016-11-30 07:47:5868
sdy93387fa2016-12-01 01:03:4469Expect the command to take 30 minutes on even a fast connection, and many
70hours on slower ones.
dpranke0ae7cad2016-11-30 07:47:5871
sdy93387fa2016-12-01 01:03:4472When `fetch` completes, it will have created a hidden `.gclient` file and a
73directory called `src` in the working directory. The remaining instructions
74assume you have switched to the `src` directory:
dpranke0ae7cad2016-11-30 07:47:5875
sdy93387fa2016-12-01 01:03:4476```shell
77$ cd src
78```
79
80*Optional*: You can also [install API
81keys](https://www.chromium.org/developers/how-tos/api-keys) if you want your
82build to talk to some Google services, but this is not necessary for most
83development and testing purposes.
andybons3322f762015-08-24 21:37:0984
dpranke1a70d0c2016-12-01 02:42:2985## Setting up the build
andybons3322f762015-08-24 21:37:0986
sdy93387fa2016-12-01 01:03:4487Chromium uses [Ninja](https://ninja-build.org) as its main build tool along
88with a tool called [GN](../tools/gn/docs/quick_start.md) to generate `.ninja`
89files. You can create any number of *build directories* with different
90configurations. To create a build directory:
andybonsad92aa32015-08-31 02:27:4491
sdy93387fa2016-12-01 01:03:4492```shell
93$ gn gen out/Default
94```
thakisf28551b2016-08-09 14:42:5595
sdy93387fa2016-12-01 01:03:4496* You only have to run this once for each new build directory, Ninja will
97 update the build files as needed.
98* You can replace `Default` with another name, but
99 it should be a subdirectory of `out`.
100* For other build arguments, including release settings, see [GN build
101 configuration](https://www.chromium.org/developers/gn-build-configuration).
dpranke0ae7cad2016-11-30 07:47:58102 The default will be a debug component build matching the current host
103 operating system and CPU.
104* For more info on GN, run `gn help` on the command line or read the
105 [quick start guide](../tools/gn/docs/quick_start.md).
thakisf28551b2016-08-09 14:42:55106
thakisf28551b2016-08-09 14:42:55107
dpranke0ae7cad2016-11-30 07:47:58108### Faster builds
andybons3322f762015-08-24 21:37:09109
andybonsad92aa32015-08-31 02:27:44110Full rebuilds are about the same speed in Debug and Release, but linking is a
111lot faster in Release builds.
andybons3322f762015-08-24 21:37:09112
thakisf28551b2016-08-09 14:42:55113Put
andybons3322f762015-08-24 21:37:09114
sdy93387fa2016-12-01 01:03:44115```
116is_debug = false
117```
andybons3322f762015-08-24 21:37:09118
sdy93387fa2016-12-01 01:03:44119in your `args.gn` to do a release build.
thakisf28551b2016-08-09 14:42:55120
121Put
122
sdy93387fa2016-12-01 01:03:44123```
124is_component_build = true
125```
thakisf28551b2016-08-09 14:42:55126
sdy93387fa2016-12-01 01:03:44127in your `args.gn` to build many small dylibs instead of a single large
128executable. This makes incremental builds much faster, at the cost of producing
129a binary that opens less quickly. Component builds work in both debug and
130release.
thakisf28551b2016-08-09 14:42:55131
132Put
133
sdy93387fa2016-12-01 01:03:44134```
135symbol_level = 0
136```
thakisf28551b2016-08-09 14:42:55137
138in your args.gn to disable debug symbols altogether. This makes both full
139rebuilds and linking faster (at the cost of not getting symbolized backtraces
140in gdb).
andybons3322f762015-08-24 21:37:09141
Philip Rogerseb841682017-10-09 16:08:50142#### Jumbo/Unity builds
143
144Jumbo builds merge many translation units ("source files") and compile them
145together. Since a large portion of Chromium's code is in shared header files,
146this dramatically reduces the total amount of work needed. Check out the
147[Jumbo / Unity builds](jumbo.md) for more information.
148
149Enable jumbo builds by setting the GN arg `use_jumbo_build=true`.
150
151#### CCache
152
philipj5a0fcb92016-01-23 23:23:40153You might also want to [install ccache](ccache_mac.md) to speed up the build.
andybons3322f762015-08-24 21:37:09154
dpranke1a70d0c2016-12-01 02:42:29155## Build Chromium
156
157Build Chromium (the "chrome" target) with Ninja using the command:
158
159```shell
Max Morozf5b31fcd2018-08-10 21:55:48160$ autoninja -C out/Default chrome
dpranke1a70d0c2016-12-01 02:42:29161```
162
Max Morozf5b31fcd2018-08-10 21:55:48163`autoninja` is a wrapper that automatically provides optimal values for the
164arguments passed to `ninja`.
165
dpranke1a70d0c2016-12-01 02:42:29166You can get a list of all of the other build targets from GN by running `gn ls
167out/Default` from the command line. To compile one, pass the GN label to Ninja
Max Morozf5b31fcd2018-08-10 21:55:48168with no preceding "//" (so, for `//chrome/test:unit_tests` use `autoninja -C
dpranke1a70d0c2016-12-01 02:42:29169out/Default chrome/test:unit_tests`).
170
dpranke0ae7cad2016-11-30 07:47:58171## Run Chromium
andybons3322f762015-08-24 21:37:09172
dpranke0ae7cad2016-11-30 07:47:58173Once it is built, you can simply run the browser:
andybons3322f762015-08-24 21:37:09174
sdy93387fa2016-12-01 01:03:44175```shell
Owen Min83eda1102017-06-28 18:47:21176$ out/Default/Chromium.app/Contents/MacOS/Chromium
sdy93387fa2016-12-01 01:03:44177```
andybons3322f762015-08-24 21:37:09178
dpranke0ae7cad2016-11-30 07:47:58179## Running test targets
andybons3322f762015-08-24 21:37:09180
dpranke0ae7cad2016-11-30 07:47:58181You can run the tests in the same way. You can also limit which tests are
182run using the `--gtest_filter` arg, e.g.:
andybons3322f762015-08-24 21:37:09183
sdy93387fa2016-12-01 01:03:44184```
dpranke1a70d0c2016-12-01 02:42:29185$ out/Default/unit_tests --gtest_filter="PushClientTest.*"
sdy93387fa2016-12-01 01:03:44186```
andybons3322f762015-08-24 21:37:09187
dpranke0ae7cad2016-11-30 07:47:58188You can find out more about GoogleTest at its
189[GitHub page](https://github.com/google/googletest).
andybons3322f762015-08-24 21:37:09190
andybonsad92aa32015-08-31 02:27:44191## Debugging
andybons3322f762015-08-24 21:37:09192
andybonsad92aa32015-08-31 02:27:44193Good debugging tips can be found
xiaoyin.l1003c0b2016-12-06 02:51:17194[here](https://dev.chromium.org/developers/how-tos/debugging-on-os-x). If you
andybonsad92aa32015-08-31 02:27:44195would like to debug in a graphical environment, rather than using `lldb` at the
sdy93387fa2016-12-01 01:03:44196command line, that is possible without building in Xcode (see
xiaoyin.l1003c0b2016-12-06 02:51:17197[Debugging in Xcode](https://www.chromium.org/developers/how-tos/debugging-on-os-x/building-with-ninja-debugging-with-xcode)).
andybons3322f762015-08-24 21:37:09198
Vaclav Brozek539499e2018-07-18 11:19:51199Tips for printing variables from `lldb` prompt (both in Xcode or in terminal):
200* If `uptr` is a `std::unique_ptr`, the address it wraps is accessible as
201 `uptr.__ptr_.__value_`.
202* To pretty-print `base::string16`, ensure you have a `~/.lldbinit` file and
203 add the following line into it (substitute {SRC} for your actual path to the
204 root of Chromium's sources):
205```
206command script import {SRC}/tools/lldb/lldb_chrome.py
207```
208
dpranke0ae7cad2016-11-30 07:47:58209## Update your checkout
andybonsad92aa32015-08-31 02:27:44210
dpranke0ae7cad2016-11-30 07:47:58211To update an existing checkout, you can run
andybonsad92aa32015-08-31 02:27:44212
sdy93387fa2016-12-01 01:03:44213```shell
214$ git rebase-update
215$ gclient sync
216```
dpranke0ae7cad2016-11-30 07:47:58217
218The first command updates the primary Chromium source repository and rebases
sdy93387fa2016-12-01 01:03:44219any of your local branches on top of tip-of-tree (aka the Git branch
220`origin/master`). If you don't want to use this script, you can also just use
221`git pull` or other common Git commands to update the repo.
dpranke0ae7cad2016-11-30 07:47:58222
sdy93387fa2016-12-01 01:03:44223The second command syncs dependencies to the appropriate versions and re-runs
224hooks as needed.
dpranke0ae7cad2016-11-30 07:47:58225
226## Tips, tricks, and troubleshooting
227
228### Using Xcode-Ninja Hybrid
andybonsad92aa32015-08-31 02:27:44229
sdy93387fa2016-12-01 01:03:44230While using Xcode is unsupported, GN supports a hybrid approach of using Ninja
thakisf28551b2016-08-09 14:42:55231for building, but Xcode for editing and driving compilation. Xcode is still
232slow, but it runs fairly well even **with indexing enabled**. Most people
sdy93387fa2016-12-01 01:03:44233build in the Terminal and write code with a text editor, though.
andybonsad92aa32015-08-31 02:27:44234
sdy93387fa2016-12-01 01:03:44235With hybrid builds, compilation is still handled by Ninja, and can be run from
236the command line (e.g. `ninja -C out/gn chrome`) or by choosing the `chrome`
237target in the hybrid workspace and choosing Build.
andybons3322f762015-08-24 21:37:09238
sdy93387fa2016-12-01 01:03:44239To use Xcode-Ninja Hybrid pass `--ide=xcode` to `gn gen`:
tfarina59fb57ac2016-03-02 18:17:24240
241```shell
sdy93387fa2016-12-01 01:03:44242$ gn gen out/gn --ide=xcode
tfarina59fb57ac2016-03-02 18:17:24243```
andybons3322f762015-08-24 21:37:09244
thakisf28551b2016-08-09 14:42:55245Open it:
tfarina59fb57ac2016-03-02 18:17:24246
247```shell
sdy93387fa2016-12-01 01:03:44248$ open out/gn/ninja/all.xcworkspace
tfarina59fb57ac2016-03-02 18:17:24249```
andybons3322f762015-08-24 21:37:09250
andybonsad92aa32015-08-31 02:27:44251You may run into a problem where http://YES is opened as a new tab every time
252you launch Chrome. To fix this, open the scheme editor for the Run scheme,
253choose the Options tab, and uncheck "Allow debugging when using document
254Versions Browser". When this option is checked, Xcode adds
sdy93387fa2016-12-01 01:03:44255`--NSDocumentRevisionsDebugMode YES` to the launch arguments, and the `YES`
256gets interpreted as a URL to open.
andybons3322f762015-08-24 21:37:09257
andybonsad92aa32015-08-31 02:27:44258If you have problems building, join us in `#chromium` on `irc.freenode.net` and
sdy93387fa2016-12-01 01:03:44259ask there. Be sure that the
xiaoyin.l1003c0b2016-12-06 02:51:17260[waterfall](https://build.chromium.org/buildbot/waterfall/) is green and the
sdy93387fa2016-12-01 01:03:44261tree is open before checking out. This will increase your chances of success.
andybons3322f762015-08-24 21:37:09262
dpranke0ae7cad2016-11-30 07:47:58263### Improving performance of `git status`
shess1f4c3d92015-11-05 18:15:37264
ishermance1d9d82017-05-12 23:10:04265#### Increase the vnode cache size
266
shess1f4c3d92015-11-05 18:15:37267`git status` is used frequently to determine the status of your checkout. Due
sdy93387fa2016-12-01 01:03:44268to the large number of files in Chromium's checkout, `git status` performance
269can be quite variable. Increasing the system's vnode cache appears to help. By
shess1f4c3d92015-11-05 18:15:37270default, this command:
271
sdy93387fa2016-12-01 01:03:44272```shell
273$ sysctl -a | egrep kern\..*vnodes
274```
shess1f4c3d92015-11-05 18:15:37275
276Outputs `kern.maxvnodes: 263168` (263168 is 257 * 1024). To increase this
277setting:
278
sdy93387fa2016-12-01 01:03:44279```shell
280$ sudo sysctl kern.maxvnodes=$((512*1024))
281```
shess1f4c3d92015-11-05 18:15:37282
283Higher values may be appropriate if you routinely move between different
284Chromium checkouts. This setting will reset on reboot, the startup setting can
285be set in `/etc/sysctl.conf`:
286
sdy93387fa2016-12-01 01:03:44287```shell
288$ echo kern.maxvnodes=$((512*1024)) | sudo tee -a /etc/sysctl.conf
289```
shess1f4c3d92015-11-05 18:15:37290
291Or edit the file directly.
292
ishermance1d9d82017-05-12 23:10:04293#### Configure git to use an untracked cache
294
295If `git --version` reports 2.8 or higher, try running
296
297```shell
298$ git update-index --test-untracked-cache
299```
300
301If the output ends with `OK`, then the following may also improve performance of
302`git status`:
303
304```shell
305$ git config core.untrackedCache true
306```
307
308If `git --version` reports 2.6 or higher, but below 2.8, you can instead run
shess1f4c3d92015-11-05 18:15:37309
sdy93387fa2016-12-01 01:03:44310```shell
311$ git update-index --untracked-cache
312```
tnagelcad631692016-04-15 11:02:36313
dpranke0ae7cad2016-11-30 07:47:58314### Xcode license agreement
tnagelcad631692016-04-15 11:02:36315
316If you're getting the error
317
sdy93387fa2016-12-01 01:03:44318> Agreeing to the Xcode/iOS license requires admin privileges, please re-run as
319> root via sudo.
tnagelcad631692016-04-15 11:02:36320
321the Xcode license hasn't been accepted yet which (contrary to the message) any
322user can do by running:
323
sdy93387fa2016-12-01 01:03:44324```shell
325$ xcodebuild -license
326```
tnagelcad631692016-04-15 11:02:36327
328Only accepting for all users of the machine requires root:
329
sdy93387fa2016-12-01 01:03:44330```shell
331$ sudo xcodebuild -license
332```