| #!/bin/bash | |
| # Copyright 2019 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| #### CATEGORY=Build | |
| ### Collect Ninja trace information for analysis in chrome://tracing | |
| ## Usage: fx ninjatrace2json | |
| ## | |
| ## Use this after a build to write "ninjatrace.json" in the build directory. | |
| set -e | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null 2>&1 && pwd)"/lib/vars.sh || exit $? | |
| fx-config-read | |
| function usage() { | |
| cat << EOF | |
| Use this after a build to write "ninjatrace.json" in the build directory. | |
| See https://fuchsia.dev/internal/intree/concepts/build-performance?hl=en#build-performance-analysis-as-a-trace. | |
| fx ninjatrace2json [options] | |
| Options: | |
| --help|-h: print this help and exit | |
| --rbe-rpl-path: when provided, interleave remote execution stats from RBE into | |
| the main trace | |
| EOF | |
| } | |
| rbe_rpl_path='' | |
| # Extract script options before -- | |
| for opt; do | |
| # handle --option arg | |
| if test -n "$prev_opt"; then | |
| eval "$prev_opt"=\$opt | |
| prev_opt= | |
| shift | |
| continue | |
| fi | |
| # Extract optarg from --opt=optarg | |
| case "$opt" in | |
| *=?*) optarg=$(expr "X$opt" : '[^=]*=\(.*\)') ;; | |
| *=) optarg= ;; | |
| esac | |
| case "$opt" in | |
| --help | -h) | |
| usage | |
| exit | |
| ;; | |
| --rbe-rpl-path=*) rbe_rpl_path="$optarg" ;; | |
| --rbe-rpl-path) prev_opt='rbe_rpl_path' ;; | |
| *) | |
| echo "Unknown option ${opt}" | |
| usage | |
| exit 1 | |
| ;; | |
| esac | |
| shift | |
| done | |
| test -z "$prev_opt" || { | |
| echo "Option is missing argument to set $prev_opt." | |
| exit 1 | |
| } | |
| TMP_DIR="$(mktemp -d)" | |
| readonly TMP_DIR | |
| trap 'rm -rf "${TMP_DIR}"' EXIT | |
| "${PREBUILT_NINJA}" -C "${FUCHSIA_BUILD_DIR}" -t compdb > "${TMP_DIR}/compdb.json" | |
| "${PREBUILT_NINJA}" -C "${FUCHSIA_BUILD_DIR}" -t graph > "${TMP_DIR}/graph.dot" | |
| ninjatrace_args=( | |
| -ninjalog "${FUCHSIA_BUILD_DIR}/.ninja_log" | |
| -compdb "${TMP_DIR}/compdb.json" | |
| -graph "${TMP_DIR}/graph.dot" | |
| -trace-json "${FUCHSIA_BUILD_DIR}/ninjatrace.json" | |
| -critical-path | |
| ) | |
| test -z "${rbe_rpl_path}" || { | |
| ninjatrace_args+=( | |
| -rbe-rpl-path "${rbe_rpl_path}" | |
| '-rpl2trace-path' "${PREBUILT_RECLIENT_DIR}/rpl2trace" | |
| ) | |
| } | |
| "${HOST_OUT_DIR}/ninjatrace" "${ninjatrace_args[@]}" | |
| echo "Now visit chrome://tracing and load ${FUCHSIA_BUILD_DIR}/ninjatrace.json" |