| #!/bin/bash |
| # Copyright 2020 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=Run, Inspect and Debug |
| ### run a host tool produced by the build |
| |
| ## usage: fx host-tool [--no-build|--force-build] TOOLNAME [TOOL_ARGS...] |
| ## |
| ## This looks for a tool named TOOLNAME in tool-paths.json and executes it |
| ## with the provided TOOL_ARGS. |
| ## --no-build does not attempt to build the tool if it does not exist |
| ## --force-build always attempt to build the tool, even if it exists |
| ## --check-firewall print a warning if the tool isn't included in firewall |
| ## rules. This is a no-op outside of macOS. |
| |
| ## If the tool is not known to the build system, for example if it is not in |
| ## the GN build graph, a proper message will be printed and the script fails. |
| ## This script is specially useful for other scripts, via fx-command-run, |
| ## although it can also be used directly by final users. |
| |
| set -e |
| |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $? |
| fx-config-read |
| |
| build=true |
| force_build=false |
| check_firewall=false |
| |
| function is_macos { |
| [[ "$(uname -s)" == "Darwin" ]] |
| } |
| |
| function firewall_cmd_macos { |
| local fw |
| if type -P "socketfilterfw"; then |
| fw="socketfilterfw" |
| else |
| fw="/usr/libexec/ApplicationFirewall/socketfilterfw" |
| fi |
| "$fw" "$@" |
| } |
| |
| function check_firewall_func { |
| if is_macos; then |
| if firewall_cmd_macos --getglobalstate | grep "disabled" > /dev/null; then |
| return 0 |
| fi |
| |
| if ! firewall_cmd_macos --getappblocked "$1" | grep "permitted" > /dev/null; then |
| fx-warn "Firewall rules are not configured, you may need to run \"fx setup-macos\"" |
| return 0 |
| fi |
| fi |
| } |
| |
| while [[ $1 == --* ]]; do |
| if [[ $1 == '--no-build' ]]; then |
| build=false |
| shift |
| elif [[ $1 == '--force-build' ]]; then |
| force_build=true |
| shift |
| elif [[ $1 == '--check-firewall' ]]; then |
| check_firewall=true |
| shift |
| else |
| fx-error "Unrecognized option: $1" |
| fx-command-help |
| exit 1 |
| fi |
| done |
| |
| if [[ $# -eq 0 || $1 == -* ]]; then |
| fx-error "Invalid syntax" |
| fx-command-help |
| exit 1 |
| fi |
| |
| toolname="$1" |
| shift |
| |
| # list-build-artifacts fails with a reasonable error message if tool is unknown |
| toolpath="$(fx-command-run list-build-artifacts --name "${toolname}" --expect-one tools)" |
| |
| # Print a warning if the firewall doesn't allow this tool from running. |
| if $check_firewall; then |
| check_firewall_func "${FUCHSIA_BUILD_DIR}/${toolpath}" |
| fi |
| |
| needs_build=false |
| |
| if $force_build; then |
| needs_build=true |
| elif [[ ! -f "${FUCHSIA_BUILD_DIR}/${toolpath}" ]]; then |
| if ! $build; then |
| fx-error "Tool does not exist and flag --no-build was used. Please build it first." |
| fx-error " ${FUCHSIA_BUILD_DIR}/${toolpath}" |
| exit 2 |
| fi |
| needs_build=true |
| fi |
| |
| if $needs_build; then |
| fx-command-run build --no-zircon "${toolpath}" |
| fi |
| |
| "${FUCHSIA_BUILD_DIR}/${toolpath}" "$@" |