blob: bfa8ed2338c20881853c0bebee12f37a6d5fc2e0 [file] [log] [blame] [view]
# Bazelification Team Resources
[TOC]
## Directory structure
* `portage/` ... for building Portage packages (aka Alchemy)
* `bin/` ... executables
* `common/` ... common Rust/Go libraries
* `build_defs/` ... build rule definitions in Starlark
* `repo_defs/` ... additional repository definitions
* `prebuilts/` ... defines prebuilt binaries
* `sdk/` ... defines the base SDK
* `tools/` ... misc small tools for development
* `workspace_root/` ... contains various files to be symlinked to the workspace root, including `WORKSPACE.bazel` and `BUILD.bazel`
## Testing your changes
The `run_tests.sh` script runs currently available tests:
```
$ portage/tools/run_tests.sh
```
Optionally, you can skip running some tests by specifying some of the following
environment variables when running `run_tests.sh`: `SKIP_CARGO_TESTS=1`,
`SKIP_BAZEL_TESTS=1`, `SKIP_PORTAGE_TESTS=1`.
If you'd like to run the tests every time you commit, add the following. You can
skip it with `git commit --no-verify`.
```sh
cd ~/chromiumos/src/bazel
ln -s ../../../../../src/bazel/portage/tools/run_tests.sh .git/hooks/pre-commit
```
## Running Bazel outside CrOS chroot
*** promo
**Running Bazel outside CrOS chroot is experimental.**
It works without setting up the CrOS SDK chroot.
`cros workon` states in the CrOS SDK chroot are ignored even if they exist, and
the live (9999) version of packages (if they exist and are not marked as
`CROS_WORKON_MANUAL_UPREV`) will be chosen by default. This means you can edit
your source code and feel confident that the correct packages are getting
rebuilt, though it might cause some build issues when live ebuilds are not
prepared for Bazel builds. Note that you'll get no remote cache hits from CI
builds today.
See [Getting Started](/docs/getting_started.md) for the currently recommended
way to run Bazel inside CrOS chroot. It is mostly compatible with the current
Portage-based build: Bazel honors Portage's site-specific configurations in
`/etc/portage` in the chroot, including `cros workon` states of packages.
Also, this is the only way you're going to get remote cache hits right now.
On the other hand, you still need to set up a CrOS SDK chroot.
***
Before you start building a package you need to ensure that `which bazel` prints
a path under your [depot_tools] checkout. The wrapper script provided by
`depot_tools` performs additional tasks besides running the real `bazel`
executable.
By default, the preflight check fails if you attempt to run Bazel outside CrOS
chroot. Set the environment variable `ALCHEMY_EXPERIMENTAL_OUTSIDE_CHROOT=1` to
bypass the check.
Then just follow [Getting Started] to run Bazel directly, except that you should
use Bazel from depot_tools and you can run it outside CrOS chroot.
[depot_tools]: https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up
[Getting Started]: /docs/getting_started.md#building-chromeos-packages-directly-with-bazel
## Building images under Bazel
*** note
As of Oct 2023, we don't actively test building ChromeOS images under Bazel
due to priority reasons. You can try the following instruction, but it may fail.
***
We have the following targets to build images:
- `@portage//images:chromiumos_minimal_image`: Minimal image that contains
`sys-apps/baselayout` and `sys-kernel/chromeos-kernel` only.
- `@portage//images:chromiumos_base_image`: Base image.
- `@portage//images:chromiumos_dev_image`: Dev image.
- `@portage//images:chromiumos_test_image`: Test image.
*** note
For historical reasons, the output file name of the dev image is
chromiumos_image.bin, not chromiumos_dev_image.bin.
***
Building a ChromeOS image takes several hours. Most packages build in a few
minutes, but there are several known heavy packages, such as
`chromeos-base/chromeos-chrome` that takes 2-3 hours. You can inject prebuilt
binary packages to bypass building those packages.
See [Injecting prebuilt binary packages] for more details.
To make `chromeos-base/chromeos-chrome` build faster, you can also use [reclient].
After building an image, you can use `cros_vm` command available in CrOS SDK
to run a VM locally. Make sure to copy an image out from `bazel-bin` as it's not
writable by default.
```sh
$ cp bazel-bin/external/_main~portage~portage/images/chromiumos_base_image.bin /tmp/
$ chmod +w /tmp/chromiumos_base_image.bin
$ chromite/bin/cros_vm --start --board=amd64-generic --image-path /tmp/chromiumos_base_image.bin
```
You can use VNC viewer to view the VM.
```sh
$ vncviewer localhost:5900
```
You can also use `cros_vm` command to stop the VM.
```sh
$ chromite/bin/cros_vm --stop
```
[Injecting prebuilt binary packages]: ../advanced.md#injecting-prebuilt-binary-packages
[reclient]: ../getting_started.md#using-reclient-for-faster-build