blob: bf811b4b3ba7d078825f591986b3b77f2091e8d3 [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
sdy93387fa2016-12-01 01:03:4444Create a `chromium` directory for the checkout and change to it (you can call
45this whatever you like and put it wherever you like, as long as the full path
46has no spaces):
dpranke0ae7cad2016-11-30 07:47:5847
sdy93387fa2016-12-01 01:03:4448```shell
49$ mkdir chromium && cd chromium
50```
51
52Run the `fetch` tool from `depot_tools` to check out the code and its
dpranke0ae7cad2016-11-30 07:47:5853dependencies.
54
sdy93387fa2016-12-01 01:03:4455```shell
56$ fetch chromium
57```
dpranke0ae7cad2016-11-30 07:47:5858
59If you don't want the full repo history, you can save a lot of time by
sdy93387fa2016-12-01 01:03:4460adding the `--no-history` flag to `fetch`.
dpranke0ae7cad2016-11-30 07:47:5861
sdy93387fa2016-12-01 01:03:4462Expect the command to take 30 minutes on even a fast connection, and many
63hours on slower ones.
dpranke0ae7cad2016-11-30 07:47:5864
sdy93387fa2016-12-01 01:03:4465When `fetch` completes, it will have created a hidden `.gclient` file and a
66directory called `src` in the working directory. The remaining instructions
67assume you have switched to the `src` directory:
dpranke0ae7cad2016-11-30 07:47:5868
sdy93387fa2016-12-01 01:03:4469```shell
70$ cd src
71```
72
73*Optional*: You can also [install API
74keys](https://www.chromium.org/developers/how-tos/api-keys) if you want your
75build to talk to some Google services, but this is not necessary for most
76development and testing purposes.
andybons3322f762015-08-24 21:37:0977
dpranke1a70d0c2016-12-01 02:42:2978## Setting up the build
andybons3322f762015-08-24 21:37:0979
sdy93387fa2016-12-01 01:03:4480Chromium uses [Ninja](https://ninja-build.org) as its main build tool along
81with a tool called [GN](../tools/gn/docs/quick_start.md) to generate `.ninja`
82files. You can create any number of *build directories* with different
83configurations. To create a build directory:
andybonsad92aa32015-08-31 02:27:4484
sdy93387fa2016-12-01 01:03:4485```shell
86$ gn gen out/Default
87```
thakisf28551b2016-08-09 14:42:5588
sdy93387fa2016-12-01 01:03:4489* You only have to run this once for each new build directory, Ninja will
90 update the build files as needed.
91* You can replace `Default` with another name, but
92 it should be a subdirectory of `out`.
93* For other build arguments, including release settings, see [GN build
94 configuration](https://www.chromium.org/developers/gn-build-configuration).
dpranke0ae7cad2016-11-30 07:47:5895 The default will be a debug component build matching the current host
96 operating system and CPU.
97* For more info on GN, run `gn help` on the command line or read the
98 [quick start guide](../tools/gn/docs/quick_start.md).
thakisf28551b2016-08-09 14:42:5599
thakisf28551b2016-08-09 14:42:55100
dpranke0ae7cad2016-11-30 07:47:58101### Faster builds
andybons3322f762015-08-24 21:37:09102
andybonsad92aa32015-08-31 02:27:44103Full rebuilds are about the same speed in Debug and Release, but linking is a
104lot faster in Release builds.
andybons3322f762015-08-24 21:37:09105
thakisf28551b2016-08-09 14:42:55106Put
andybons3322f762015-08-24 21:37:09107
sdy93387fa2016-12-01 01:03:44108```
109is_debug = false
110```
andybons3322f762015-08-24 21:37:09111
sdy93387fa2016-12-01 01:03:44112in your `args.gn` to do a release build.
thakisf28551b2016-08-09 14:42:55113
114Put
115
sdy93387fa2016-12-01 01:03:44116```
117is_component_build = true
118```
thakisf28551b2016-08-09 14:42:55119
sdy93387fa2016-12-01 01:03:44120in your `args.gn` to build many small dylibs instead of a single large
121executable. This makes incremental builds much faster, at the cost of producing
122a binary that opens less quickly. Component builds work in both debug and
123release.
thakisf28551b2016-08-09 14:42:55124
125Put
126
sdy93387fa2016-12-01 01:03:44127```
128symbol_level = 0
129```
thakisf28551b2016-08-09 14:42:55130
131in your args.gn to disable debug symbols altogether. This makes both full
132rebuilds and linking faster (at the cost of not getting symbolized backtraces
133in gdb).
andybons3322f762015-08-24 21:37:09134
Philip Rogerseb841682017-10-09 16:08:50135#### Jumbo/Unity builds
136
137Jumbo builds merge many translation units ("source files") and compile them
138together. Since a large portion of Chromium's code is in shared header files,
139this dramatically reduces the total amount of work needed. Check out the
140[Jumbo / Unity builds](jumbo.md) for more information.
141
142Enable jumbo builds by setting the GN arg `use_jumbo_build=true`.
143
144#### CCache
145
philipj5a0fcb92016-01-23 23:23:40146You might also want to [install ccache](ccache_mac.md) to speed up the build.
andybons3322f762015-08-24 21:37:09147
dpranke1a70d0c2016-12-01 02:42:29148## Build Chromium
149
150Build Chromium (the "chrome" target) with Ninja using the command:
151
152```shell
153$ ninja -C out/Default chrome
154```
155
156You can get a list of all of the other build targets from GN by running `gn ls
157out/Default` from the command line. To compile one, pass the GN label to Ninja
158with no preceding "//" (so, for `//chrome/test:unit_tests` use `ninja -C
159out/Default chrome/test:unit_tests`).
160
dpranke0ae7cad2016-11-30 07:47:58161## Run Chromium
andybons3322f762015-08-24 21:37:09162
dpranke0ae7cad2016-11-30 07:47:58163Once it is built, you can simply run the browser:
andybons3322f762015-08-24 21:37:09164
sdy93387fa2016-12-01 01:03:44165```shell
Owen Min83eda1102017-06-28 18:47:21166$ out/Default/Chromium.app/Contents/MacOS/Chromium
sdy93387fa2016-12-01 01:03:44167```
andybons3322f762015-08-24 21:37:09168
dpranke0ae7cad2016-11-30 07:47:58169## Running test targets
andybons3322f762015-08-24 21:37:09170
dpranke0ae7cad2016-11-30 07:47:58171You can run the tests in the same way. You can also limit which tests are
172run using the `--gtest_filter` arg, e.g.:
andybons3322f762015-08-24 21:37:09173
sdy93387fa2016-12-01 01:03:44174```
dpranke1a70d0c2016-12-01 02:42:29175$ out/Default/unit_tests --gtest_filter="PushClientTest.*"
sdy93387fa2016-12-01 01:03:44176```
andybons3322f762015-08-24 21:37:09177
dpranke0ae7cad2016-11-30 07:47:58178You can find out more about GoogleTest at its
179[GitHub page](https://github.com/google/googletest).
andybons3322f762015-08-24 21:37:09180
andybonsad92aa32015-08-31 02:27:44181## Debugging
andybons3322f762015-08-24 21:37:09182
andybonsad92aa32015-08-31 02:27:44183Good debugging tips can be found
xiaoyin.l1003c0b2016-12-06 02:51:17184[here](https://dev.chromium.org/developers/how-tos/debugging-on-os-x). If you
andybonsad92aa32015-08-31 02:27:44185would like to debug in a graphical environment, rather than using `lldb` at the
sdy93387fa2016-12-01 01:03:44186command line, that is possible without building in Xcode (see
xiaoyin.l1003c0b2016-12-06 02:51:17187[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:09188
dpranke0ae7cad2016-11-30 07:47:58189## Update your checkout
andybonsad92aa32015-08-31 02:27:44190
dpranke0ae7cad2016-11-30 07:47:58191To update an existing checkout, you can run
andybonsad92aa32015-08-31 02:27:44192
sdy93387fa2016-12-01 01:03:44193```shell
194$ git rebase-update
195$ gclient sync
196```
dpranke0ae7cad2016-11-30 07:47:58197
198The first command updates the primary Chromium source repository and rebases
sdy93387fa2016-12-01 01:03:44199any of your local branches on top of tip-of-tree (aka the Git branch
200`origin/master`). If you don't want to use this script, you can also just use
201`git pull` or other common Git commands to update the repo.
dpranke0ae7cad2016-11-30 07:47:58202
sdy93387fa2016-12-01 01:03:44203The second command syncs dependencies to the appropriate versions and re-runs
204hooks as needed.
dpranke0ae7cad2016-11-30 07:47:58205
206## Tips, tricks, and troubleshooting
207
208### Using Xcode-Ninja Hybrid
andybonsad92aa32015-08-31 02:27:44209
sdy93387fa2016-12-01 01:03:44210While using Xcode is unsupported, GN supports a hybrid approach of using Ninja
thakisf28551b2016-08-09 14:42:55211for building, but Xcode for editing and driving compilation. Xcode is still
212slow, but it runs fairly well even **with indexing enabled**. Most people
sdy93387fa2016-12-01 01:03:44213build in the Terminal and write code with a text editor, though.
andybonsad92aa32015-08-31 02:27:44214
sdy93387fa2016-12-01 01:03:44215With hybrid builds, compilation is still handled by Ninja, and can be run from
216the command line (e.g. `ninja -C out/gn chrome`) or by choosing the `chrome`
217target in the hybrid workspace and choosing Build.
andybons3322f762015-08-24 21:37:09218
sdy93387fa2016-12-01 01:03:44219To use Xcode-Ninja Hybrid pass `--ide=xcode` to `gn gen`:
tfarina59fb57ac2016-03-02 18:17:24220
221```shell
sdy93387fa2016-12-01 01:03:44222$ gn gen out/gn --ide=xcode
tfarina59fb57ac2016-03-02 18:17:24223```
andybons3322f762015-08-24 21:37:09224
thakisf28551b2016-08-09 14:42:55225Open it:
tfarina59fb57ac2016-03-02 18:17:24226
227```shell
sdy93387fa2016-12-01 01:03:44228$ open out/gn/ninja/all.xcworkspace
tfarina59fb57ac2016-03-02 18:17:24229```
andybons3322f762015-08-24 21:37:09230
andybonsad92aa32015-08-31 02:27:44231You may run into a problem where http://YES is opened as a new tab every time
232you launch Chrome. To fix this, open the scheme editor for the Run scheme,
233choose the Options tab, and uncheck "Allow debugging when using document
234Versions Browser". When this option is checked, Xcode adds
sdy93387fa2016-12-01 01:03:44235`--NSDocumentRevisionsDebugMode YES` to the launch arguments, and the `YES`
236gets interpreted as a URL to open.
andybons3322f762015-08-24 21:37:09237
andybonsad92aa32015-08-31 02:27:44238If you have problems building, join us in `#chromium` on `irc.freenode.net` and
sdy93387fa2016-12-01 01:03:44239ask there. Be sure that the
xiaoyin.l1003c0b2016-12-06 02:51:17240[waterfall](https://build.chromium.org/buildbot/waterfall/) is green and the
sdy93387fa2016-12-01 01:03:44241tree is open before checking out. This will increase your chances of success.
andybons3322f762015-08-24 21:37:09242
dpranke0ae7cad2016-11-30 07:47:58243### Improving performance of `git status`
shess1f4c3d92015-11-05 18:15:37244
ishermance1d9d82017-05-12 23:10:04245#### Increase the vnode cache size
246
shess1f4c3d92015-11-05 18:15:37247`git status` is used frequently to determine the status of your checkout. Due
sdy93387fa2016-12-01 01:03:44248to the large number of files in Chromium's checkout, `git status` performance
249can be quite variable. Increasing the system's vnode cache appears to help. By
shess1f4c3d92015-11-05 18:15:37250default, this command:
251
sdy93387fa2016-12-01 01:03:44252```shell
253$ sysctl -a | egrep kern\..*vnodes
254```
shess1f4c3d92015-11-05 18:15:37255
256Outputs `kern.maxvnodes: 263168` (263168 is 257 * 1024). To increase this
257setting:
258
sdy93387fa2016-12-01 01:03:44259```shell
260$ sudo sysctl kern.maxvnodes=$((512*1024))
261```
shess1f4c3d92015-11-05 18:15:37262
263Higher values may be appropriate if you routinely move between different
264Chromium checkouts. This setting will reset on reboot, the startup setting can
265be set in `/etc/sysctl.conf`:
266
sdy93387fa2016-12-01 01:03:44267```shell
268$ echo kern.maxvnodes=$((512*1024)) | sudo tee -a /etc/sysctl.conf
269```
shess1f4c3d92015-11-05 18:15:37270
271Or edit the file directly.
272
ishermance1d9d82017-05-12 23:10:04273#### Configure git to use an untracked cache
274
275If `git --version` reports 2.8 or higher, try running
276
277```shell
278$ git update-index --test-untracked-cache
279```
280
281If the output ends with `OK`, then the following may also improve performance of
282`git status`:
283
284```shell
285$ git config core.untrackedCache true
286```
287
288If `git --version` reports 2.6 or higher, but below 2.8, you can instead run
shess1f4c3d92015-11-05 18:15:37289
sdy93387fa2016-12-01 01:03:44290```shell
291$ git update-index --untracked-cache
292```
tnagelcad631692016-04-15 11:02:36293
dpranke0ae7cad2016-11-30 07:47:58294### Xcode license agreement
tnagelcad631692016-04-15 11:02:36295
296If you're getting the error
297
sdy93387fa2016-12-01 01:03:44298> Agreeing to the Xcode/iOS license requires admin privileges, please re-run as
299> root via sudo.
tnagelcad631692016-04-15 11:02:36300
301the Xcode license hasn't been accepted yet which (contrary to the message) any
302user can do by running:
303
sdy93387fa2016-12-01 01:03:44304```shell
305$ xcodebuild -license
306```
tnagelcad631692016-04-15 11:02:36307
308Only accepting for all users of the machine requires root:
309
sdy93387fa2016-12-01 01:03:44310```shell
311$ sudo xcodebuild -license
312```