| #!/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=Internal API |
| ### Builds and returns a list of a desired set of build artifacts |
| |
| ## usage: fx list-build-artifacts [--build] [--allow-empty | --expect-one] [FILTERS...] MODE |
| ## |
| ## Builds and returns a list of paths to special sets of build artifacts within |
| ## the GN graph relative to the build directory. |
| ## |
| ## --build build the artifacts as well as returning a list of them |
| ## --allow-empty do not fail if no such artifacts are found |
| ## --expect-one fail if zero or more than one artifacts are found. This |
| ## option is mutually exclusive from `--allow-empty`. |
| ## --name filter the set of artifacts to pick out the particular one of |
| ## the same name |
| ## --os filter the set of artifacts by intended operating system: one |
| ## of `fuchsia`, `linux`, or `mac`. Defaults to $HOST_OS when |
| ## the mode is `tools.` |
| ## --cpu filter the set of artifacts by intended architecture: one of |
| ## `x64` or `arm64`. Defaults to $HOST_CPU when the mode is |
| ## `tools`. |
| ## --type filter the set of artifacts by type. |
| ## |
| ## MODE One of the following: |
| ## `images` -- returns the list of images |
| ## `pave`-- returns the list of images needed to pave; |
| ## `pave-zedboot`-- returns the list of images needed to pave |
| ## zedboot; |
| ## `netboot`-- returns the list of images needed to netboot |
| ## `flash`-- returns the list of images needed to flash |
| ## `mkzedboot` -- returns the list of images needed to mkzedboot |
| ## `tools` -- returns the list of host tools |
| ## `zbi-tests`-- returns the list of ZBI tests |
| ## `generated-sources`-- returns the list of generated sources |
| ### (e.g., FIDL and Banjo bindings). |
| ## |
| |
| set -o errexit |
| |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh |
| fx-config-read |
| |
| readonly IMAGES_JSON="images.json" |
| readonly TOOL_PATHS_JSON="tool_paths.json" |
| readonly ZBI_TESTS_JSON="zbi_tests.json" |
| readonly GENERATED_SOURCES_JSON="generated_sources.json" |
| |
| build=false |
| allow_empty=false |
| expect_one=false |
| mode="" |
| name="" |
| os="" |
| cpu="" |
| type="" |
| while [[ $# -ne 0 ]]; do |
| case "$1" in |
| --help|-h) |
| fx-command-help |
| exit 0 |
| ;; |
| --build) |
| build=true |
| ;; |
| --allow-empty) |
| allow_empty=true |
| ;; |
| --expect-one) |
| expect_one=true |
| ;; |
| --name) |
| shift |
| name="$1" |
| ;; |
| --os) |
| shift |
| os="$1" |
| ;; |
| --cpu) |
| shift |
| cpu="$1" |
| ;; |
| --type) |
| shift |
| type="$1" |
| ;; |
| -*) |
| 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 |
| |
| if [[ -z "${mode}" ]]; then |
| fx-error "MODE must be specified" |
| fx-command-help |
| exit 1 |
| fi |
| |
| if $allow_empty && $expect_one ; then |
| fx-error "cannot set both --allow-empty and --expect-one" |
| fx-command-help |
| exit 1 |
| fi |
| |
| # Some build API modules are just plain JSON lists; in that case, we should |
| # not apply any filters. |
| is_list_like=false |
| manifest="" |
| jq_filter=".[]" |
| paths=() |
| if [[ "${mode}" == images ]]; then |
| manifest="${IMAGES_JSON}" |
| elif [[ "${mode}" == pave ]]; then |
| manifest="${IMAGES_JSON}" |
| paths+=("pave.sh") |
| jq_filter+=" | select(.bootserver_pave != null)" |
| elif [[ "${mode}" == pave-zedboot ]]; then |
| manifest="${IMAGES_JSON}" |
| paths+=("pave-zedboot.sh") |
| jq_filter+=" | select(.bootserver_pave_zedboot != null)" |
| elif [[ "${mode}" == netboot ]]; then |
| manifest="${IMAGES_JSON}" |
| paths+=("netboot.sh") |
| jq_filter+=" | select(.bootserver_netboot != null)" |
| elif [[ "${mode}" == flash ]]; then |
| manifest="${IMAGES_JSON}" |
| paths+=("flash.sh") |
| jq_filter+=" | select(.fastboot_flash != null)" |
| elif [[ "${mode}" == mkzedboot ]]; then |
| manifest="${IMAGES_JSON}" |
| jq_filter+=" | select(.mkzedboot_mode != null)" |
| elif [[ "${mode}" == tools ]]; then |
| manifest="${TOOL_PATHS_JSON}" |
| os="${os:-${HOST_OS}}" |
| cpu="${cpu:-${HOST_CPU}}" |
| elif [[ "${mode}" == zbi-tests ]]; then |
| manifest="${ZBI_TESTS_JSON}" |
| elif [[ "${mode}" == generated-sources ]]; then |
| manifest="${GENERATED_SOURCES_JSON}" |
| is_list_like=true |
| else |
| fx-error "unknown MODE: ${mode}" |
| fx-command-help |
| exit 1 |
| fi |
| |
| if [[ ! -z "${name}" ]]; then |
| jq_filter+=" | select(.name == \"${name}\")" |
| # Filter existing paths by the name as well. |
| if [[ "${paths[@]}" =~ "${name}" ]]; then |
| paths=("${name}") |
| else |
| paths=() |
| fi |
| fi |
| |
| if ! $is_list_like ; then |
| if [[ ! -z "${os}" ]]; then |
| jq_filter+=" | select(.os == \"${os}\")" |
| fi |
| if [[ ! -z "${cpu}" ]]; then |
| jq_filter+=" | select(.cpu == \"${cpu}\")" |
| fi |
| if [[ ! -z "${type}" ]]; then |
| jq_filter+=" | select(.type == \"${type}\")" |
| fi |
| jq_filter+=" | .path" |
| fi |
| |
| paths+=($(fx-command-run jq --raw-output "${jq_filter}" "${FUCHSIA_BUILD_DIR}/${manifest}")) |
| if $build && [[ ${#paths[@]} -ne 0 ]] ; then |
| # For efficiency's sake, we avoid having to build zircon when building |
| # host-side artifacts. |
| if [[ ! -z "${os}" && "$os" != fuchsia ]]; then |
| fx-command-run build --no-zircon "${paths[@]}" >&2 |
| else |
| fx-command-run build "${paths[@]}" >&2 |
| fi |
| fi |
| |
| if [[ ${#paths[@]} -eq 0 ]] && (! $allow_empty || $expect_one) ; then |
| fx-error "found no artifacts in the GN graph of type \"${mode}\" with (name, os, cpu, type) == (\"${name:-*}\", \"${os:-*}\", \"${cpu:-*}\", \"${type:-*}\")" |
| exit 1 |
| fi |
| |
| if [[ ${#paths[@]} -gt 1 ]] && $expect_one ; then |
| fx-error "expected one artifact; found multiple: ${paths[@]}" |
| exit 1 |
| fi |
| |
| echo "${paths[@]}" |