blob: 5cb85cba2025b91650ced4f256ab6fda7f735490 [file] [log] [blame] [view]
# Debugging Build Issues
[TOC]
## Asking for help
If you are unsure how to resolve build errors in Bazel-orchestrated builds,
please send an email to chromeos-build-discuss@google.com.
## Common build issues
### Build-time package dependencies are missing
**Cause**:
Only explicitly declared build-time dependency packages are made available in
the ephemeral CrOS SDK container when building a Portage package under Bazel.
**Symptom**:
Missing build-time package dependencies result in a variety of error messages,
including:
- `foobar: command not found`
- `No such file or directory: 'foobar'`
- `Package foobar was not found in the pkg-config search path.`
- `'path/to/foobar.h' file not found`
- `unable to find library -lfoobar`
- `Program 'foobar' not found or not executable`
- `import error: No module named 'foobar'`
- `no matching package named foobar found`
- `cannot find package "foobar" in any of:`
**Solution**:
Make sure you declare proper `DEPEND`/`BDEPEND` in your ebuild/eclasses.
**Example fixes**:
- [Adding a missing DEPEND](https://crrev.com/c/4840362)
- [Adding a missing BDEPEND](https://crrev.com/c/4983365)
### Implicit build-time dependencies are missing
**Cause**:
Ebuilds/eclasses are prohibited to access ChromeOS source checkout via
`/mnt/host/source` unless those dependencies are explicitly declared with
`CROS_WORKON_*`.
**Symptom**:
Implicit build-time dependencies result in a variety of error messages,
including `foobar: command not found`.
**Solution**:
Declare extra sources in [Bazel-specific metadata].
[Bazel-specific metadata]: ./advanced.md#declaring-bazel_specific-ebuild_eclass-metadata
**Example fixes**:
TBD
### Uses sudo
**Cause**:
`sudo` doesn't work in the ephemeral CrOS SDK container used to build Portage
packages as it is unprivileged. In fact, `/usr/bin/sudo` is replaced with
a fake script that just executes the specified command.
**Symptom**:
If your package attempts to run `sudo`, the following message will be printed
to the standard error:
```
fake_sudo: INFO: This is the fake sudo for the ephemeral CrOS SDK.
```
This message doesn't mean an immediate failure, but the subsequent process will
run unprivileged.
**Solution**:
Do not use `sudo` in the package build.
If your package uses `platform2_test.py` to run foreign-architecture
executables on build, pass `--strategy=unprivileged` to run the script without
sudo.
**Example fixes**:
- [Passing `--strategy=unprivileged` to platform2_test.py](https://crrev.com/c/4683119)
## How to debug build errors
### Entering ephemeral CrOS SDK containers
Sometimes you want to enter an ephemeral CrOS SDK container where a package
build is failing to inspect the environment interactively.
To enter an ephemeral CrOS SDK container, run the following command:
```
$ BOARD=amd64-generic bazel run @portage//target/sys-apps/attr:debug -- --login=after
```
This command will give you an interactive shell after building a package.
You can also specify other values to `--login` to choose the timing to enter
an interactive console:
- `--login=before`: before building the package
- `--login=after`: after building the package (default)
- `--login=after-fail`: after failing to build the package
### Dump Alchemist's view of a package
It can be useful to see what Alchemist understands about a package to see why
the Bazel build is behaving a certain way. You can use this command to dump
this information for a given package:
`bazel run //:alchemist -- --board ${BOARD} dump-package ${PACKAGE}`
or
`bazel run //:alchemist -- --host dump-package ${PACKAGE}`
Example:
```
$ bazel run //:alchemist -- --board amd64-generic dump-package sys-apps/portage
Path: /mnt/host/source/src/third_party/chromiumos-overlay/sys-apps/portage/portage-2.3.75-r161.ebuild
Package: sys-apps/portage
Version: 2.3.75-r161 (Default)
Slot: 0/0
Stable: true
Readiness: OK (not masked)
USE: +abi_x86_64 -alpha +amd64 -amd64-fbsd -amd64-linux -arm -arm-linux -arm64 -build -cros_host -cros_workon_tree_e947dfa7fd9f6280412b8b58481e9dcc226465ca -doc -elibc_AIX -elibc_Cygwin -elibc_Darwin -elibc_DragonFly -elibc_FreeBSD -elibc_HPUX -elibc_Interix -elibc_NetBSD -elibc_OpenBSD -elibc_SunOS -elibc_Winnt -elibc_bionic +elibc_glibc -elibc_mingw -elibc_mintlib -elibc_musl -elibc_uclibc -epydoc -gentoo-dev -hppa -hppa-hpux -ia64 -ia64-hpux -ia64-linux +ipc -kernel_AIX -kernel_Darwin -kernel_FreeBSD -kernel_HPUX -kernel_NetBSD -kernel_OpenBSD -kernel_SunOS -kernel_Winnt -kernel_freemint +kernel_linux -m68k -m68k-mint -mips +native-extensions -nios2 -ppc -ppc-aix -ppc-macos -ppc-openbsd -ppc64 -ppc64-linux -prefix -prefix-guest -prefix-stack -python_targets_python3_6 -python_targets_python3_7 +python_targets_python3_8 -python_targets_python3_9 -riscv -rsync-verify -s390 -selinux -sh -sparc -sparc-fbsd -sparc-solaris -sparc64-freebsd -sparc64-solaris -userland_BSD +userland_GNU -x64-cygwin -x64-freebsd -x64-macos -x64-openbsd -x64-solaris -x86 -x86-cygwin -x86-fbsd -x86-freebsd -x86-interix -x86-linux -x86-macos -x86-netbsd -x86-openbsd -x86-solaris -x86-winnt +xattr
BDEPEND:
app-misc/jq-1.7_pre20201109-r1::portage-stable
dev-lang/python-3.8.16_p4-r5::chromiumos
dev-lang/python-exec-2.4.6-r4::portage-stable
dev-python/setuptools-44.0.0::portage-stable
dev-vcs/git-2.39.2-r1::portage-stable
IDEPEND:
DEPEND:
app-arch/tar-1.34-r3::portage-stable
dev-lang/python-3.8.16_p4-r5::chromiumos
dev-lang/python-3.8.16_p4-r5::chromiumos
dev-lang/python-exec-2.4.6-r4::portage-stable
dev-lang/python-exec-2.4.6-r4::portage-stable
sys-apps/sed-4.8::portage-stable
sys-devel/patch-2.7.6-r5::portage-stable
RDEPEND:
app-arch/tar-1.34-r3::portage-stable
app-misc/pax-utils-1.3.3::portage-stable
app-shells/bash-5.1_p16-r2::portage-stable
dev-lang/python-3.8.16_p4-r5::chromiumos
dev-lang/python-exec-2.4.6-r4::portage-stable
dev-lang/python-exec-2.4.6-r4::portage-stable
sys-apps/install-xattr-0.8-r1::portage-stable
sys-apps/sed-4.8::portage-stable
PDEPEND:
net-misc/rsync-3.2.7-r2::portage-stable
sys-apps/coreutils-8.32-r2::portage-stable
```
You can also use the `--env` flag to dump the environment variables for the
package, which can be useful for viewing information such as USE flags.
### Bad cache results when non-hermetic inputs change
Bazel is able to correctly reuse content from the cache when all inputs are
identified to it so it can detect when they change. Since our toolchain and our
host tools (e.g. gsutil) are not yet fully hermetic, it's possible that you'll
run into problems when tools not yet tracked by Bazel are updated. In these
situations we've found it useful to run `bazel clean --expunge` to clear cached
artifacts that seem not to be cleared without the `--expunge` flag.
If you find you need the `--expunge` flag, please file a bug to let the
Bazelification team know about the non-hermeticity so we can fix the problem.