blob: 3ab976e9d6085b3957deda259691fa04534d79bb [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
Gabriel Charetteb6780c12019-04-24 16:23:5234Add `depot_tools` to the end of your PATH (you will probably want to put this in
35your `~/.bash_profile` or `~/.zshrc`). Assuming you cloned `depot_tools` to
36`/path/to/depot_tools` (note: you **must** use the absolute path or Python will
37not be able to find infra tools):
dpranke0ae7cad2016-11-30 07:47:5838
sdy93387fa2016-12-01 01:03:4439```shell
40$ export PATH="$PATH:/path/to/depot_tools"
41```
dpranke0ae7cad2016-11-30 07:47:5842
43## Get the code
44
Aaron Gable94b7e2a32018-01-03 19:14:4145Ensure that unicode filenames aren't mangled by HFS:
46
47```shell
48$ git config --global core.precomposeUnicode true
49```
50
sdy93387fa2016-12-01 01:03:4451Create a `chromium` directory for the checkout and change to it (you can call
52this whatever you like and put it wherever you like, as long as the full path
53has no spaces):
dpranke0ae7cad2016-11-30 07:47:5854
sdy93387fa2016-12-01 01:03:4455```shell
56$ mkdir chromium && cd chromium
57```
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
[email protected]1436b952018-10-26 16:35:1366If you don't need the full repo history, you can save time by using
Yannic Bonenbergera68557002019-04-29 14:13:1967`fetch --no-history chromium`. You can call `git fetch --unshallow` to retrieve
68the full history later.
dpranke0ae7cad2016-11-30 07:47:5869
sdy93387fa2016-12-01 01:03:4470Expect the command to take 30 minutes on even a fast connection, and many
71hours on slower ones.
dpranke0ae7cad2016-11-30 07:47:5872
sdy93387fa2016-12-01 01:03:4473When `fetch` completes, it will have created a hidden `.gclient` file and a
74directory called `src` in the working directory. The remaining instructions
75assume you have switched to the `src` directory:
dpranke0ae7cad2016-11-30 07:47:5876
sdy93387fa2016-12-01 01:03:4477```shell
78$ cd src
79```
80
81*Optional*: You can also [install API
82keys](https://www.chromium.org/developers/how-tos/api-keys) if you want your
83build to talk to some Google services, but this is not necessary for most
84development and testing purposes.
andybons3322f762015-08-24 21:37:0985
dpranke1a70d0c2016-12-01 02:42:2986## Setting up the build
andybons3322f762015-08-24 21:37:0987
Tom Bridgwatereef401542018-08-17 00:54:4388Chromium uses [Ninja](https://ninja-build.org) as its main build tool along with
89a tool called [GN](https://gn.googlesource.com/gn/+/master/docs/quick_start.md)
90to generate `.ninja` files. You can create any number of *build directories*
91with different configurations. To create a build directory:
andybonsad92aa32015-08-31 02:27:4492
sdy93387fa2016-12-01 01:03:4493```shell
94$ gn gen out/Default
95```
thakisf28551b2016-08-09 14:42:5596
sdy93387fa2016-12-01 01:03:4497* You only have to run this once for each new build directory, Ninja will
98 update the build files as needed.
99* You can replace `Default` with another name, but
100 it should be a subdirectory of `out`.
101* For other build arguments, including release settings, see [GN build
102 configuration](https://www.chromium.org/developers/gn-build-configuration).
dpranke0ae7cad2016-11-30 07:47:58103 The default will be a debug component build matching the current host
104 operating system and CPU.
105* For more info on GN, run `gn help` on the command line or read the
106 [quick start guide](../tools/gn/docs/quick_start.md).
thakisf28551b2016-08-09 14:42:55107
thakisf28551b2016-08-09 14:42:55108
dpranke0ae7cad2016-11-30 07:47:58109### Faster builds
andybons3322f762015-08-24 21:37:09110
andybonsad92aa32015-08-31 02:27:44111Full rebuilds are about the same speed in Debug and Release, but linking is a
112lot faster in Release builds.
andybons3322f762015-08-24 21:37:09113
thakisf28551b2016-08-09 14:42:55114Put
andybons3322f762015-08-24 21:37:09115
sdy93387fa2016-12-01 01:03:44116```
117is_debug = false
118```
andybons3322f762015-08-24 21:37:09119
sdy93387fa2016-12-01 01:03:44120in your `args.gn` to do a release build.
thakisf28551b2016-08-09 14:42:55121
122Put
123
sdy93387fa2016-12-01 01:03:44124```
125is_component_build = true
126```
thakisf28551b2016-08-09 14:42:55127
sdy93387fa2016-12-01 01:03:44128in your `args.gn` to build many small dylibs instead of a single large
129executable. This makes incremental builds much faster, at the cost of producing
130a binary that opens less quickly. Component builds work in both debug and
131release.
thakisf28551b2016-08-09 14:42:55132
133Put
134
sdy93387fa2016-12-01 01:03:44135```
136symbol_level = 0
137```
thakisf28551b2016-08-09 14:42:55138
139in your args.gn to disable debug symbols altogether. This makes both full
140rebuilds and linking faster (at the cost of not getting symbolized backtraces
141in gdb).
andybons3322f762015-08-24 21:37:09142
Philip Rogerseb841682017-10-09 16:08:50143#### Jumbo/Unity builds
144
145Jumbo builds merge many translation units ("source files") and compile them
146together. Since a large portion of Chromium's code is in shared header files,
147this dramatically reduces the total amount of work needed. Check out the
148[Jumbo / Unity builds](jumbo.md) for more information.
149
150Enable jumbo builds by setting the GN arg `use_jumbo_build=true`.
151
152#### CCache
153
philipj5a0fcb92016-01-23 23:23:40154You might also want to [install ccache](ccache_mac.md) to speed up the build.
andybons3322f762015-08-24 21:37:09155
dpranke1a70d0c2016-12-01 02:42:29156## Build Chromium
157
158Build Chromium (the "chrome" target) with Ninja using the command:
159
160```shell
Max Morozf5b31fcd2018-08-10 21:55:48161$ autoninja -C out/Default chrome
dpranke1a70d0c2016-12-01 02:42:29162```
163
Dirk Pranke8bd55f22018-10-24 21:22:10164(`autoninja` is a wrapper that automatically provides optimal values for the
165arguments passed to `ninja`.)
Max Morozf5b31fcd2018-08-10 21:55:48166
dpranke1a70d0c2016-12-01 02:42:29167You can get a list of all of the other build targets from GN by running `gn ls
168out/Default` from the command line. To compile one, pass the GN label to Ninja
Max Morozf5b31fcd2018-08-10 21:55:48169with no preceding "//" (so, for `//chrome/test:unit_tests` use `autoninja -C
dpranke1a70d0c2016-12-01 02:42:29170out/Default chrome/test:unit_tests`).
171
dpranke0ae7cad2016-11-30 07:47:58172## Run Chromium
andybons3322f762015-08-24 21:37:09173
dpranke0ae7cad2016-11-30 07:47:58174Once it is built, you can simply run the browser:
andybons3322f762015-08-24 21:37:09175
sdy93387fa2016-12-01 01:03:44176```shell
Owen Min83eda1102017-06-28 18:47:21177$ out/Default/Chromium.app/Contents/MacOS/Chromium
sdy93387fa2016-12-01 01:03:44178```
andybons3322f762015-08-24 21:37:09179
dpranke0ae7cad2016-11-30 07:47:58180## Running test targets
andybons3322f762015-08-24 21:37:09181
dpranke0ae7cad2016-11-30 07:47:58182You can run the tests in the same way. You can also limit which tests are
183run using the `--gtest_filter` arg, e.g.:
andybons3322f762015-08-24 21:37:09184
sdy93387fa2016-12-01 01:03:44185```
dpranke1a70d0c2016-12-01 02:42:29186$ out/Default/unit_tests --gtest_filter="PushClientTest.*"
sdy93387fa2016-12-01 01:03:44187```
andybons3322f762015-08-24 21:37:09188
dpranke0ae7cad2016-11-30 07:47:58189You can find out more about GoogleTest at its
190[GitHub page](https://github.com/google/googletest).
andybons3322f762015-08-24 21:37:09191
andybonsad92aa32015-08-31 02:27:44192## Debugging
andybons3322f762015-08-24 21:37:09193
andybonsad92aa32015-08-31 02:27:44194Good debugging tips can be found
xiaoyin.l1003c0b2016-12-06 02:51:17195[here](https://dev.chromium.org/developers/how-tos/debugging-on-os-x). If you
andybonsad92aa32015-08-31 02:27:44196would like to debug in a graphical environment, rather than using `lldb` at the
sdy93387fa2016-12-01 01:03:44197command line, that is possible without building in Xcode (see
xiaoyin.l1003c0b2016-12-06 02:51:17198[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:09199
Vaclav Brozek539499e2018-07-18 11:19:51200Tips for printing variables from `lldb` prompt (both in Xcode or in terminal):
201* If `uptr` is a `std::unique_ptr`, the address it wraps is accessible as
202 `uptr.__ptr_.__value_`.
203* To pretty-print `base::string16`, ensure you have a `~/.lldbinit` file and
204 add the following line into it (substitute {SRC} for your actual path to the
205 root of Chromium's sources):
206```
207command script import {SRC}/tools/lldb/lldb_chrome.py
208```
209
dpranke0ae7cad2016-11-30 07:47:58210## Update your checkout
andybonsad92aa32015-08-31 02:27:44211
dpranke0ae7cad2016-11-30 07:47:58212To update an existing checkout, you can run
andybonsad92aa32015-08-31 02:27:44213
sdy93387fa2016-12-01 01:03:44214```shell
215$ git rebase-update
216$ gclient sync
217```
dpranke0ae7cad2016-11-30 07:47:58218
219The first command updates the primary Chromium source repository and rebases
sdy93387fa2016-12-01 01:03:44220any of your local branches on top of tip-of-tree (aka the Git branch
221`origin/master`). If you don't want to use this script, you can also just use
222`git pull` or other common Git commands to update the repo.
dpranke0ae7cad2016-11-30 07:47:58223
sdy93387fa2016-12-01 01:03:44224The second command syncs dependencies to the appropriate versions and re-runs
225hooks as needed.
dpranke0ae7cad2016-11-30 07:47:58226
227## Tips, tricks, and troubleshooting
228
229### Using Xcode-Ninja Hybrid
andybonsad92aa32015-08-31 02:27:44230
sdy93387fa2016-12-01 01:03:44231While using Xcode is unsupported, GN supports a hybrid approach of using Ninja
thakisf28551b2016-08-09 14:42:55232for building, but Xcode for editing and driving compilation. Xcode is still
233slow, but it runs fairly well even **with indexing enabled**. Most people
sdy93387fa2016-12-01 01:03:44234build in the Terminal and write code with a text editor, though.
andybonsad92aa32015-08-31 02:27:44235
sdy93387fa2016-12-01 01:03:44236With hybrid builds, compilation is still handled by Ninja, and can be run from
Dirk Pranke8bd55f22018-10-24 21:22:10237the command line (e.g. `autoninja -C out/gn chrome`) or by choosing the `chrome`
sdy93387fa2016-12-01 01:03:44238target in the hybrid workspace and choosing Build.
andybons3322f762015-08-24 21:37:09239
sdy93387fa2016-12-01 01:03:44240To use Xcode-Ninja Hybrid pass `--ide=xcode` to `gn gen`:
tfarina59fb57ac2016-03-02 18:17:24241
242```shell
sdy93387fa2016-12-01 01:03:44243$ gn gen out/gn --ide=xcode
tfarina59fb57ac2016-03-02 18:17:24244```
andybons3322f762015-08-24 21:37:09245
thakisf28551b2016-08-09 14:42:55246Open it:
tfarina59fb57ac2016-03-02 18:17:24247
248```shell
sdy93387fa2016-12-01 01:03:44249$ open out/gn/ninja/all.xcworkspace
tfarina59fb57ac2016-03-02 18:17:24250```
andybons3322f762015-08-24 21:37:09251
andybonsad92aa32015-08-31 02:27:44252You may run into a problem where http://YES is opened as a new tab every time
253you launch Chrome. To fix this, open the scheme editor for the Run scheme,
254choose the Options tab, and uncheck "Allow debugging when using document
255Versions Browser". When this option is checked, Xcode adds
sdy93387fa2016-12-01 01:03:44256`--NSDocumentRevisionsDebugMode YES` to the launch arguments, and the `YES`
257gets interpreted as a URL to open.
andybons3322f762015-08-24 21:37:09258
andybonsad92aa32015-08-31 02:27:44259If you have problems building, join us in `#chromium` on `irc.freenode.net` and
sdy93387fa2016-12-01 01:03:44260ask there. Be sure that the
xiaoyin.l1003c0b2016-12-06 02:51:17261[waterfall](https://build.chromium.org/buildbot/waterfall/) is green and the
sdy93387fa2016-12-01 01:03:44262tree is open before checking out. This will increase your chances of success.
andybons3322f762015-08-24 21:37:09263
dpranke0ae7cad2016-11-30 07:47:58264### Improving performance of `git status`
shess1f4c3d92015-11-05 18:15:37265
ishermance1d9d82017-05-12 23:10:04266#### Increase the vnode cache size
267
shess1f4c3d92015-11-05 18:15:37268`git status` is used frequently to determine the status of your checkout. Due
sdy93387fa2016-12-01 01:03:44269to the large number of files in Chromium's checkout, `git status` performance
270can be quite variable. Increasing the system's vnode cache appears to help. By
shess1f4c3d92015-11-05 18:15:37271default, this command:
272
sdy93387fa2016-12-01 01:03:44273```shell
274$ sysctl -a | egrep kern\..*vnodes
275```
shess1f4c3d92015-11-05 18:15:37276
277Outputs `kern.maxvnodes: 263168` (263168 is 257 * 1024). To increase this
278setting:
279
sdy93387fa2016-12-01 01:03:44280```shell
281$ sudo sysctl kern.maxvnodes=$((512*1024))
282```
shess1f4c3d92015-11-05 18:15:37283
284Higher values may be appropriate if you routinely move between different
285Chromium checkouts. This setting will reset on reboot, the startup setting can
286be set in `/etc/sysctl.conf`:
287
sdy93387fa2016-12-01 01:03:44288```shell
289$ echo kern.maxvnodes=$((512*1024)) | sudo tee -a /etc/sysctl.conf
290```
shess1f4c3d92015-11-05 18:15:37291
292Or edit the file directly.
293
ishermance1d9d82017-05-12 23:10:04294#### Configure git to use an untracked cache
295
296If `git --version` reports 2.8 or higher, try running
297
298```shell
299$ git update-index --test-untracked-cache
300```
301
302If the output ends with `OK`, then the following may also improve performance of
303`git status`:
304
305```shell
306$ git config core.untrackedCache true
307```
308
309If `git --version` reports 2.6 or higher, but below 2.8, you can instead run
shess1f4c3d92015-11-05 18:15:37310
sdy93387fa2016-12-01 01:03:44311```shell
312$ git update-index --untracked-cache
313```
tnagelcad631692016-04-15 11:02:36314
dpranke0ae7cad2016-11-30 07:47:58315### Xcode license agreement
tnagelcad631692016-04-15 11:02:36316
317If you're getting the error
318
sdy93387fa2016-12-01 01:03:44319> Agreeing to the Xcode/iOS license requires admin privileges, please re-run as
320> root via sudo.
tnagelcad631692016-04-15 11:02:36321
322the Xcode license hasn't been accepted yet which (contrary to the message) any
323user can do by running:
324
sdy93387fa2016-12-01 01:03:44325```shell
326$ xcodebuild -license
327```
tnagelcad631692016-04-15 11:02:36328
329Only accepting for all users of the machine requires root:
330
sdy93387fa2016-12-01 01:03:44331```shell
332$ sudo xcodebuild -license
333```