| #!/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}" |