| #!/bin/bash | |
| # Copyright 2024 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=Other | |
| ### manage build profile configuration | |
| ## usage: | |
| ## fx build-profile status | |
| ## Show if system profiling during fx build is enabled or disabled. | |
| ## | |
| ## fx build-profile enable | |
| ## Enable system profiling during fx build. | |
| ## | |
| ## fx build-profile disable | |
| ## Disable system profiling during fx build. | |
| ## | |
| ## Build profiles contain information about the state of your system | |
| ## resources such as CPU, memory, disk I/O, and network usage. | |
| ## The 'system_profiler' utility (located at //build/profile/system_profiler.py) | |
| ## collects this data natively on Linux. | |
| ## Build profile data contains no PII. | |
| set -e | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $? | |
| source "${FUCHSIA_DIR}/tools/devshell/lib/style.sh" || exit $? | |
| readonly BUILD_PROFILE_CONFIG="${FUCHSIA_DIR}/.fx/config/build-profile" | |
| readonly BUILD_PROFILE_CONFIG_OLD="${FUCHSIA_DIR}/.fx-build-profile-config" | |
| function usage { | |
| fx-command-help | |
| } | |
| function styled-status { | |
| local enabled="$1" | |
| local profile_status | |
| if [[ "$BUILD_PROFILE_ENABLED" -eq 1 ]]; then | |
| profile_status="enabled" | |
| color="green" | |
| else | |
| profile_status="disabled" | |
| color="red" | |
| fi | |
| style::echo --bold "--${color}" "${profile_status}" | |
| } | |
| fx-standard-switches "$@" | |
| set -- "${FX_ARGV[@]}" | |
| if [[ $# -lt 1 ]]; then | |
| fx-error Invalid syntax | |
| fx-command-help | |
| exit 1 | |
| fi | |
| action="$1" | |
| shift | |
| action_args=("$@") | |
| function build-profile-read-config { | |
| BUILD_PROFILE_ENABLED=0 | |
| if [[ -f "${BUILD_PROFILE_CONFIG_OLD}" ]]; then | |
| fx-info "Moving ${BUILD_PROFILE_CONFIG_OLD} to new location ${BUILD_PROFILE_CONFIG}. No further action is necessary." | |
| mv "${BUILD_PROFILE_CONFIG_OLD}" "${BUILD_PROFILE_CONFIG}" | |
| fi | |
| if [[ ! -f "${BUILD_PROFILE_CONFIG}" ]]; then | |
| return 1 | |
| fi | |
| source "${BUILD_PROFILE_CONFIG}" | |
| return 0 | |
| } | |
| function build-profile-write-config { | |
| local enabled="$1" | |
| local -r tempfile="${BUILD_PROFILE_CONFIG}.tmp" | |
| cat > "${tempfile}" <<EOF | |
| # Autogenerated config file for 'fx build-profile'. | |
| # Run 'fx help build-profile' for more information. | |
| BUILD_PROFILE_ENABLED=${enabled} | |
| EOF | |
| # Only rewrite the config file if content has changed | |
| if ! cmp --silent "${tempfile}" "${BUILD_PROFILE_CONFIG}" | |
| then mv -f "${tempfile}" "${BUILD_PROFILE_CONFIG}" | |
| else rm -f "${tempfile}" | |
| fi | |
| } | |
| # Read config in a way that exit code is preserved but doesn't exit because | |
| # of "set -e" if config file doesn't exist | |
| __successfully_read_config=0 | |
| build-profile-read-config || __successfully_read_config="$?" | |
| case "$action" in | |
| -h|--help) | |
| usage | |
| exit 0 | |
| ;; | |
| status) | |
| echo "Collection of system profiles during builds is currently $(styled-status "$BUILD_PROFILE_ENABLED") for ${FUCHSIA_DIR}" | |
| echo "To change it, run: fx build-profile <enable|disable>" | |
| exit 0 | |
| ;; | |
| enable) | |
| if [[ "$BUILD_PROFILE_ENABLED" -eq 1 ]]; then | |
| echo "System profiling during build is already enabled." | |
| exit 0 | |
| fi | |
| BUILD_PROFILE_ENABLED=1 | |
| build-profile-write-config "${BUILD_PROFILE_ENABLED}" | |
| echo "System profiling during build is enabled at user's request" | |
| ;; | |
| disable) | |
| if [[ "$BUILD_PROFILE_ENABLED" -eq 0 ]]; then | |
| if [[ "${__successfully_read_config}" -ne 0 ]]; then | |
| # if profile is already disabled but the config file does not exist or | |
| # is inconsistent, we rewrite the file before exiting | |
| build-profile-write-config "${BUILD_PROFILE_ENABLED}" | |
| fi | |
| echo "System profiling during build is already disabled." | |
| exit 0 | |
| fi | |
| BUILD_PROFILE_ENABLED=0 | |
| build-profile-write-config "${BUILD_PROFILE_ENABLED}" | |
| echo "System profiling during build is disabled at user's request" | |
| ;; | |
| *) | |
| fx-error Invalid syntax | |
| fx-command-help | |
| exit 1 | |
| ;; | |
| esac | |
| echo "System profiling during build is now $(styled-status "$BUILD_PROFILE_ENABLED") for ${FUCHSIA_DIR}" |