| # Copyright 2021 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. | |
| # The functions here are used to compile Dart commands, but may be generalized | |
| # later to support compiling other tools if needed. This functionality is also | |
| # covered by host-tools code, but host-tools doesn't correctly generate the | |
| # metadata entries in //out/default/tool_paths.json for Dart binaries. | |
| # Build the tool, but only if necessary. | |
| function _build { | |
| local target="$1" | |
| local executable="$2" | |
| fx-info "Building required tool \"${target}\"..." | |
| if ! fx-command-run build "${target}"; then | |
| fx-error "Could not compile ${executable##*/}" | |
| exit 1 | |
| fi | |
| } | |
| # Run a dart tool, checking first if it needs to be built. The calling script | |
| # must call `fx-config-read` before calling this function because it depends on | |
| # HOST_OUT_DIR. | |
| function run-dart-tool { | |
| local tool_name="$1" | |
| shift | |
| local executable="${HOST_OUT_DIR}/dart-tools/${tool_name}" | |
| local tool_build_target="${HOST_OUT_DIR##*/}/dart-tools/${tool_name}" | |
| # Rebuild if the binary isn't present. Generally, the Dart executable is | |
| # rebuilt as part of an `fx build` so always up-to-date. | |
| if [[ ! -f "${executable}" ]]; then | |
| _build "${tool_build_target}" "${executable}" | |
| fi | |
| "${executable}" "$@" | |
| local status=$? | |
| if [[ "${status}" == 253 ]]; then | |
| # This error typically occurs when files that the executable depends on | |
| # have been updated, but the executable itself has not. Rebuilding the | |
| # command. | |
| _build "${tool_build_target}" "${executable}" | |
| "${executable}" "$@" | |
| status=$? | |
| fi | |
| exit "${status}" | |
| } |