blob: 0a84047752e8eafedcf76743110c9e84a2535d90 [file] [log] [blame] [view]
# Checking out and building on Fuchsia
***Note that the Fuchsia port is in the early stages, and things are likely to
frequently be broken. Try #cr-fuchsia on Freenode or Slack if something seems
awry.***
There are instructions for other platforms linked from the
[get the code](get_the_code.md) page.
[TOC]
## System requirements
* A 64-bit Intel machine with at least 8GB of RAM. More than 16GB is highly
recommended.
* At least 100GB of free disk space.
* You must have Git and Python installed already.
Most development is done on Ubuntu. Mac build is supported on a best-effort
basis.
## Install `depot_tools`
Clone the `depot_tools` repository:
```shell
$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
```
Add `depot_tools` to the end of your PATH (you will probably want to put this
in your `~/.bashrc` or `~/.zshrc`). Assuming you cloned `depot_tools` to
`/path/to/depot_tools`:
```shell
$ export PATH="$PATH:/path/to/depot_tools"
```
## Get the code
Create a `chromium` directory for the checkout and change to it (you can call
this whatever you like and put it wherever you like, as long as the full path
has no spaces):
```shell
$ mkdir ~/chromium && cd ~/chromium
```
Run the `fetch` tool from depot_tools to check out the code and its
dependencies.
```shell
$ fetch --nohooks chromium
```
Expect the command to take 30 minutes on even a fast connection, and many
hours on slower ones.
If you've already installed the build dependencies on the machine (from another
checkout, for example), you can omit the `--nohooks` flag and `fetch`
will automatically execute `gclient runhooks` at the end.
When `fetch` completes, it will have created a hidden `.gclient` file and a
directory called `src` in the working directory.
### Configure for building on Fuchsia
Edit `.gclient` to include (this is a list, so it could also include `android`,
etc. if necessary.)
```
target_os = ['fuchsia']
```
Note that this should be added as a top-level statement in the `.gclient` file,
not an entry inside the `solutions` dict. An example `.gclient` file would look
as follows:
```
solutions = [
{
"url": "https://chromium.googlesource.com/chromium/src.git",
"managed": False,
"name": "src",
"custom_deps": {},
"custom_vars": {}
}
]
target_os = ['fuchsia']
```
You will then need to run:
```shell
$ gclient sync
```
This makes sure the Fuchsia SDK is available in third\_party and keeps it up to
date.
The remaining instructions assume you have switched to the `src` directory:
```shell
$ cd src
```
### (Linux-only) Install any required host packages
Chromium relies on some platform packages to be present in order to build.
You can install the current set of required packages with:
```shell
$ build/install-build-deps.sh
```
Note that you need to do this only once, and thereafter only if new dependencies
are added - these will be announced to the chromium-dev@ group.
### Update your checkout
To update an existing checkout, you can run
```shell
$ git rebase-update
$ gclient sync
```
The first command updates the primary Chromium source repository and rebases
any of your local branches on top of tip-of-tree (aka the Git branch
`origin/main`). If you don't want to use this script, you can also just use
`git pull` or other common Git commands to update the repo.
The second command syncs dependencies to the appropriate versions and re-runs
hooks as needed. `gclient sync` updates dependencies to the versions specified
in `DEPS`, so any time that file is modified (pulling, changing branches, etc.)
`gclient sync` should be run.
## (Mac-only) Download additional required Clang binaries
Go to [this page](https://chrome-infra-packages.appspot.com/p/fuchsia/clang/mac-amd64/+/)
and download the most recent build. Extract `bin/llvm-ar` to the clang folder
in Chromium:
```shell
$ unzip /path/to/clang.zip bin/llvm-ar -d ${CHROMIUM_SRC}/third_party/llvm-build/Release+Asserts
```
## Setting up the build
Chromium uses [Ninja](https://ninja-build.org) as its main build tool along with
a tool called [GN](https://gn.googlesource.com/gn/+/main/docs/quick_start.md)
to generate `.ninja` files. You can create any number of *build directories*
with different configurations. To create a build directory, run:
```shell
$ gn gen out/fuchsia --args="is_debug=false dcheck_always_on=true is_component_build=false target_os=\"fuchsia\""
```
You can also build for Debug, with `is_debug=true`, but since we don't currently
have any Debug build-bots, it may be more broken than Release.
`use_goma=true` is fine to use also if you're a Googler.
Architecture options are x64 (default) and arm64. This can be set with
`target_cpu=\"arm64\"`.
## Build
All targets included in the GN build should build successfully. You can also
build a specific binary, for example, base\_unittests:
```shell
$ autoninja -C out/fuchsia base_unittests
```
(`autoninja` is a wrapper that automatically provides optimal values for the
arguments passed to `ninja`.)
## Run
Once you've built a package, you'll want to run it!
### (Recommended)(Linux-only) Enable KVM acceleration
Under Linux, if your host and target CPU architectures are the same (e.g. you're
building for Fuchsia/x64 on a Linux/x64 host) then you can benefit from QEMU's
support for the KVM hypervisor:
1. Install the KVM module for your kernel, to get a /dev/kvm device.
2. Ensure that your system has a "kvm" group, and it owns /dev/kvm.
You can do that by installing the QEMU system common package:
```shell
$ sudo apt-get install qemu-system-common
```
3. Add users to the "kvm" group, and have them login again, to pick-up the new
group.
```shell
$ sudo adduser <user> kvm
$ exit
[log in again]
```
### Running test suites
There are three types of tests available to run on Fuchsia:
1. [Gtests](gtests.md)
2. [GPU integration tests](gpu_testing.md)
3. [Blink tests](web_tests.md)
Check the documentations to learn more about how to run these tests.