| #!/bin/bash | |
| # Copyright 2023 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=Internal API | |
| ### Builds and returns a list of a desired set of build artifacts | |
| ## usage: fx get-flash-source [--build] [--allow-empty | --expect-one] | |
| ## | |
| ## Builds and returns the source file for `fx flash` with an appropriate | |
| ## prefix. This returns 'flash-manifest:<path>' or 'product-bundle:<path>' | |
| ## depending on the type of source relevant for the current build | |
| ## configuration. | |
| ## | |
| ## --build build the artifacts as well as returning a list of them | |
| ## | |
| set -o errexit | |
| # shellcheck source=/dev/null | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh | |
| fx-config-read | |
| readonly ARGS_JSON="args.json" | |
| readonly PRODUCT_BUNDLES_JSON="product_bundles.json" | |
| build=false | |
| while [[ $# -ne 0 ]]; do | |
| case "$1" in | |
| --help|-h) | |
| fx-command-help | |
| exit 0 | |
| ;; | |
| --build) | |
| build=true | |
| ;; | |
| -*) | |
| fx-error "Unknown flag: $1" | |
| fx-command-help | |
| exit 1 | |
| ;; | |
| *) | |
| if [[ -z "${mode}" ]]; then | |
| mode="$1" | |
| else | |
| fx-error "unexpected argument: '$1'" | |
| exit 1 | |
| fi | |
| ;; | |
| esac | |
| shift | |
| done | |
| function _query_manifest { | |
| local manifest="$1" | |
| local jq_filter="$2" | |
| local paths | |
| fx-command-stdout-to-array paths fx-command-run jq --raw-output "${jq_filter}" "${FUCHSIA_BUILD_DIR}/${manifest}" | |
| # At most one path is supported. | |
| if [[ ${#paths[@]} -gt 1 ]]; then | |
| fx-error "More than one path found!" | |
| exit 1 | |
| fi | |
| printf %s "${paths[0]}" | |
| } | |
| function _build_gn_label { | |
| # Important: redirect stdout to stderr to avoid polluting this script's | |
| # output. See https://fxbug.dev/42076242 | |
| >&2 fx-command-run build "$1" | |
| } | |
| main_pb_label="$(_query_manifest "${ARGS_JSON}" .main_pb_label)" | |
| if [[ "${main_pb_label}" != "null" ]]; then | |
| product_bundle_label="$(_query_manifest "${PRODUCT_BUNDLES_JSON}" ".[] | select(.label | startswith(\"${main_pb_label}\")) | .label")" | |
| product_bundle="$(_query_manifest "${PRODUCT_BUNDLES_JSON}" ".[] | select(.label | startswith(\"${main_pb_label}\")) | .path")" | |
| else | |
| product="$(_query_manifest "${ARGS_JSON}" .build_info_product)" | |
| board="$(_query_manifest "${ARGS_JSON}" .build_info_board)" | |
| product_bundle_name="${product}.${board}" | |
| product_bundle="$(_query_manifest "${PRODUCT_BUNDLES_JSON}" ".[] | select(.name == \"${product_bundle_name}\") | .path")" | |
| product_bundle_label="$(_query_manifest "${PRODUCT_BUNDLES_JSON}" ".[] | select(.name == \"${product_bundle_name}\")| .label")" | |
| if [[ -z "${product_bundle}" ]]; then | |
| fx-error "Failed to find a product bundle." | |
| fx-error "Use \"ffx product list\" to see the list of available product bundles then run \"ffx target flash -b <product-bundle>\"." | |
| exit 1 | |
| fi | |
| fi | |
| if $build ; then | |
| _build_gn_label "${product_bundle_label}" | |
| fi | |
| echo "product-bundle:${product_bundle}" |