| # 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 |