blob: 0c129021c901c0584a1efb444e505114e16c49fe [file] [log] [blame] [view]
# Perfetto build instructions
The source of truth for the Perfetto codebase lives in AOSP:
https://android.googlesource.com/platform/external/perfetto/
A read-only mirror is also available at https://github.com/google/perfetto .
Perfetto can be built both from the Android tree (AOSP) and standalone.
Standalone builds are meant only for local testing and are not shipped.
Due to the reduced dependencies they are faster to iterate on and the
suggested way to work on Perfetto.
## Get the code
**Standalone checkout**:
```bash
git clone https://android.googlesource.com/platform/external/perfetto/
```
**Android tree**:
Perfetto lives in [`external/perfetto` in the AOSP tree](https://cs.android.com/android/platform/superproject/+/master:external/perfetto/).
## Prerequisites
**Standalone checkout**:
All dependent libraries are self-hosted and pulled through:
```bash
tools/install-build-deps [--android] [--ui]
```
**Android tree**:
See https://source.android.com/setup
## Building
**Standalone checkout**:
If you are a chromium developer and have depot_tools installed you can avoid
the `tools/` prefix below and just use gn/ninja from depot_tools.
`$ tools/gn args out/android` to generate build files and enter in the editor:
```python
target_os = "android" # Only when building for Android
target_cpu = "arm" / "arm64" / "x64"
is_debug = true / false
cc_wrapper = "ccache" # Optionally speed repeated builds with ccache
```
(See the [Build Configurations](#build-configurations) section below for more)
```bash
tools/ninja -C out/android
```
**Android tree**
`mmma external/perfetto`
or
`m perfetto traced traced_probes`
This will generate artifacts `out/target/product/XXX/system/`.
Executables and shared libraries are stripped by default by the Android build
system. The unstripped artifacts are kept into `out/target/product/XXX/symbols`.
## UI development
This command pulls the UI-related dependencies (notably, the NodeJS binary)
and installs the `node_modules` in `ui/node_modules`:
```bash
tools/install-build-deps --ui
```
Build the UI:
```bash
# Will build into ./out/ui by default. Can be changed with --out path/
# The final bundle will be available at ./ui/out/dist/.
# The build script creates a symlink from ./ui/out to $OUT_PATH/ui/.
ui/build
```
Test your changes on a local server using:
```bash
# This will automatically build the UI. There is no need to manually run
# ui/build before running ui/run-dev-server.
ui/run-dev-server
```
Navigate to http://localhost:10000/ to see the changes.
The server supports live reloading of CSS and TS/JS contents. Whenever a ui
source file is changed it, the script will automatically re-build it and show a
prompt in the web page.
## IDE setup
Use a following command in the checkout directory in order to generate the
compilation database file:
```bash
tools/gn gen out/default --export-compile-commands
```
After generating, it can be used in CLion (File -> Open -> Open As Project),
Visual Studio Code with C/C++ extension and any other tool and editor that
supports the compilation database format.
## Build files
The source of truth of our build file is in the BUILD.gn files, which are based
on [GN][gn-quickstart].
The Android build file ([Android.bp](/Android.bp)) is autogenerated from the GN
files through `tools/gen_android_bp`, which needs to be invoked whenever a
change touches GN files or introduces new ones.
A presubmit check checks that the Android.bp is consistent with GN files when
submitting a CL through `git cl upload`.
The generator has a list of root targets that will be translated into the
Android.bp file. If you are adding a new target, add a new entry to the
`default_targets` variable in [`tools/gen_android_bp`](/tools/gen_android_bp).
## Supported platforms
**Linux desktop** (Debian Rodete)
- Hermetic clang + libcxx toolchain (both following chromium's revisions)
- GCC-7 and libstdc++ 6
**Android**
- Android's NDK r15c (using NDK's libcxx)
- AOSP's in-tree clang (using in-tree libcxx)
**Mac**
- XCode 9 / clang (currently maintained best-effort).
**Windows**
Windows builds are not currently supported when using the standalone checkout
and GN. Windows is supported only for a subset of the targets (mainly
`trace_processor` and the in-process version of the
[Tracing SDK](/docs/instrumentation/tracing-sdk.md)) in two ways:
(1) when building through Bazel; (2) when building as part of Chromium.
## Build configurations
TIP: `tools/build_all_configs.py` can be used to generate out/XXX folders for
most of the supported configurations.
The following [GN args][gn-quickstart] are supported:
`target_os = "android" | "linux" | "mac"`:
Defaults to the current host, set "android" to build for Android.
`target_cpu = "arm" | "arm64" | "x64"`
Defaults to `"arm"` when `target_os` == `"android"`, `"x64"` when targeting the
host. 32-bit host builds are not supported.
Note: x64 here really means x86_64. This is to keep it consistent with
Chromium's choice, which in turn follows Windows naming convention.
`is_debug = true | false`
Toggles Debug (default) / Release mode. This affects, among other things:
(i) the `-g` compiler flag; (ii) setting/unsetting `-DNDEBUG`; (iii) turning
on/off `DCHECK` and `DLOG`.
Note that debug builds of Perfetto are sensibly slower than release versions. We
strongly encourage using debug builds only for local development.
`is_clang = true | false`
Use Clang (default: true) or GCC (false).
On Linux, by default it uses the self-hosted clang (see `is_hermetic_clang`).
On Android, by default it uses clang from the NDK (in `buildtools/ndk`).
On Mac, by default it uses the system version of clang (requires Xcode).
See also the [custom toolchain](#custom-toolchain) section below.
`is_hermetic_clang = true | false`
Use bundled toolchain from `buildtools/` rather than system-wide one.
`cc = "gcc" / cxx = "g++"`
Uses a different compiler binary (default: autodetected depending on is_clang).
See also the [custom toolchain](#custom-toolchain) section below.
`cc_wrapper = "tool_name"`
Prepends all build commands with a wrapper command. Using `"ccache"` here
enables the [ccache](https://github.com/ccache/ccache) caching compiler,
which can considerably speed up repeat builds.
`is_asan = true`
Enables [Address Sanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer)
`is_lsan = true`
Enables [Leak Sanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer)
(Linux/Mac only)
`is_msan = true`
Enables [Memory Sanitizer](https://github.com/google/sanitizers/wiki/MemorySanitizer)
(Linux only)
`is_tsan = true`
Enables [Thread Sanitizer](https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual)
(Linux/Mac only)
`is_ubsan = true`
Enables [Undefined Behavior Sanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html)
### {#custom-toolchain} Using custom toolchains and CC / CXX / CFLAGS env vars
When building Perfetto as part of some other build environment it might be
necessary to switch off all the built-in toolchain-related path-guessing scripts
and manually specify the path of the toolchains.
```python
# Disable the scripts that guess the path of the toolchain.
is_system_compiler = true
ar = "/path/to/ar"
cc = "/path/to/gcc-like-compiler"
cxx = "/path/to/g++-like-compiler"
linker = "" # This is passed to -fuse-ld=...
```
If you are using a build system that keeps the toolchain settings in
environment variables, you can set:
```python
is_system_compiler = true
ar="${AR}"
cc="${CC}"
cxx="${CXX}"
```
`is_system_compiler = true` can be used also for cross-compilation.
In case of cross-compilation, the GN variables have the following semantic:
`ar`, `cc`, `cxx`, `linker` refer to the _host_ toolchain (sometimes also called
_build_ toolchain). This toolchain is used to build: (i) auxiliary tools
(e.g. the `traceconv` conversion util) and (ii) executable artifacts that are
used during the rest of the build process for the target (e.g., the `protoc`
compiler or the `protozero_plugin` protoc compiler plugin).
The cross-toolchain used to build the artifacts that run on the device is
prefixed by `target_`: `target_ar`, `target_cc`, `target_cxx`, `target_linker`.
```python
# Cross compilation kicks in when at least one of these three variables is set
# to a value != than the host defaults.
target_cpu = "x86" | "x64" | "arm" | "arm64"
target_os = "linux" | "android"
target_triplet = "arm-linux-gnueabi" | "x86_64-linux-gnu" | ...
```
When integrating with GNU Makefile cross-toolchains build environments, a
typical mapping of the corresponding environment variables is:
```python
ar="${BUILD_AR}"
cc="${BUILD_CC}"
cxx="${BUILD_CXX}"
target_ar="${AR}"
target_cc="${CC}"
target_cxx="${CXX}"
```
It is possible to extend the set of `CFLAGS` and `CXXFLAGS` through the
`extra_xxxflags` GN variables as follows. The extra flags are always appended
(hence, take precedence) to the set of flags that the GN build files generate.
```python
# These apply both to host and target toolchain.
extra_cflags="${CFLAGS}"
extra_cxxflags="${CXXFLAGS}"
extra_ldflags="${LDFLAGS}"
# These apply only to the host toolchain.
extra_host_cflags="${BUILD_CFLAGS}"
extra_host_cxxflags="${BUILD_CXXFLAGS}"
extra_host_ldflags="${BUILD_LDFLAGS}"
# These apply only to the target toolchain.
extra_target_cflags="${CFLAGS}"
extra_target_cxxflags="${CXXFLAGS} ${debug_flags}"
extra_target_ldflags="${LDFLAGS}"
```
[gn-quickstart]: https://gn.googlesource.com/gn/+/master/docs/quick_start.md