blob: dea9ca8140945f41427e739ff32cd87e06956051 [file] [log] [blame] [edit]
#!/bin/bash
# Copyright 2025 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=Build
### set which product bundle to build in a multi-product environment
## usage: fx set-main-pb <product-bundle-name>
##
## fx set-main-pb with `ffx.ui.mode = tui` set will prompt you to choose a product bundle.
## ffx.ui.mode can be set using `ffx config set ffx.ui.mode tui`
## The UI mode for just fx use can be set with e.g.
## `ffx config set ffx.ui.overrides.fx-set-main-pb text`
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
source "$SCRIPT_DIR/lib/vars.sh" || exit $?
fx-config-read
set -e
function check_has_product_bundles() {
if [[ $# -eq 0 ]]; then
echo "product_bundles.json does not contain ANY products"
echo "Try adding some to 'product_bundle_labels'"
exit 1
fi
}
function print_available {
check_has_product_bundles "$@"
echo "Available product bundles:"
printf ' %s\n' "$@" | sort
echo ""
echo "Tip: Try zsh-completion with //scripts/zsh-completion/README.md"
exit 1
}
function main {
local product_bundle="$1"
case "${product_bundle}" in
-h | --help)
fx-command-help
return 0
;;
esac
mapfile -t AVAILABLE < <(fx-command-run jq -r ".[].name" "$FUCHSIA_BUILD_DIR/product_bundles.json")
if [[ -z "${product_bundle}" ]]; then
use_tui=$(fx-get-ui-mode "fx-set-main-pb")
if [[ "$use_tui" == "tui" ]]; then
# TUI picker
check_has_product_bundles "${AVAILABLE[@]}"
chosen_pb="$(fx-filter-tui "${AVAILABLE[@]}" --select-if-one --header="Select a product bundle:")"
# strip off any trailing spaces and the '(current)' string
local suffix=" (current)"
if [[ "${chosen_pb}" == *"${suffix}" ]]; then
product_bundle="${chosen_pb%$suffix}"
else
product_bundle="${chosen_pb}"
fi
if [[ -z "${product_bundle}" ]]; then
# This can happen if users close out of the picker without selecting anything
fx-error "No product bundle picked. If you still want to change product bundles,\nrun this command again and select a product bundle."
return 1
fi
else
# Non-TUI default
fx-command-help
if [[ "${#AVAILABLE[@]}" -gt 0 ]]; then
echo ""
print_available "${AVAILABLE[@]}"
fi
fi
fi
JQ_FILTER="first(.[] | select(((.label | split(\"(\"))[0] == \"$product_bundle\") or .name == \"$product_bundle\") | .label)"
LABEL=$(fx-command-run jq -r "$JQ_FILTER" "$FUCHSIA_BUILD_DIR/product_bundles.json")
LABEL=${LABEL%\(*}
if [[ -z $LABEL ]]; then
echo "product_bundles.json does not contain product: $1"
echo ""
print_available "${AVAILABLE[@]}"
fi
GN_ARGS_ENTRY="main_pb_label = \"${LABEL}\""
OUT="$FUCHSIA_BUILD_DIR/args.gn"
TMP="$OUT.tmp"
rm -f "$TMP"
PRETTY_OUT=${OUT#"$FUCHSIA_DIR"/}
# If args.gn already has `main_pb_label`, then we update it.
if grep -q "main_pb_label" "$OUT"; then
# If args.gn already has the fully-correct line, then we exit early
if grep -qoPz "main_pb_label\s*=\s*\"$LABEL\"" "$OUT"; then
echo "main_pb_label already set to $LABEL."
echo "args.gn not changed."
rm -f "$TMP"
return 0
# args.gn has the wrong label, so update it.
else
echo "Adding to $PRETTY_OUT:"
echo " $GN_ARGS_ENTRY"
# This prefix ensures that we match multiple lines in sed in case
# the GN has been formatted to wrap to a new line.
PREFIX=':a;N;$!ba;'
FIND='main_pb_label[[:space:]]*=[[:space:]]*"[^"]*"'
cat "$OUT" | sed "${PREFIX}s#${FIND}#${GN_ARGS_ENTRY}#g" > "$TMP"
mv "$TMP" "$OUT"
fi
# If we didn't find an existing main PB, then we add it to the end.
else
echo "Adding to $PRETTY_OUT:"
echo " $GN_ARGS_ENTRY"
echo "$GN_ARGS_ENTRY" >> "$OUT"
fi
echo ""
echo "Running 'fx gen'"
echo "..."
fx-gen
}
main "$@"