blob: b28df86072401bd81f3f9a3d015c46d03fdb12c7 [file] [log] [blame]
#!/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=Kernel
### Publish a product zbi to be flashed to a device for development.
# Currently only supports products that use bazel assembly.
## usage: fx build-zbi [--input-bundles-dir PATH] [--product-config PATH] [--board-config PATH] [--board-name PATH]
##
## --input-bundles-dir PATH Path to input bundles directory. If not provided, tries to auto-discover.
## --product-config PATH Path to product configuration. If not provided, tries to auto-discover.
## --board-config PATH Path to board configuration. If not provided, tries to auto-discover.
## --board-name PATH Path to board name. If not provided, tries to auto-discover.
set -o errexit
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../lib/vars.sh
fx-config-read
# Default values
input_bundles_dir="$FUCHSIA_BUILD_DIR/obj/bundles/assembly/eng/platform_artifacts"
product_config=""
board_config=""
board_name=""
# Parse args
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
fx-command-help
exit 0
;;
--input-bundles-dir)
input_bundles_dir="$2"
shift 2
;;
--product-config)
product_config="$2"
shift 2
;;
--board-name)
board_name="$2"
shift 2
;;
--board-config)
board_config="$2"
shift 2
;;
*)
echo "Unknown argument: $1"
exit 1
;;
esac
done
# Auto-discovery
main_pb_label="$(fx-command-run jq -r ".main_pb_label // empty" "$FUCHSIA_BUILD_DIR/args.json")"
if [[ -z "$main_pb_label" ]]; then
echo "Error: main_pb_label is not set in args.json. Please make sure you're using a product that supports fx build-zbi (such as fuchsia.x64) and use fx set-main-pb to select the product."
exit 1
fi
if [[ -z "$product_config" ]]; then
echo "Using main pb label: $main_pb_label"
main_pb_path=${main_pb_label//:/\/}
product_config=$FUCHSIA_BUILD_DIR/obj/${main_pb_path:2}_product_config
echo "Using product config: $product_config"
fi
# Query the metadata to find the board config label
if [[ -z $board_name ]]; then
board_name=${main_pb_label#*.}
fi
echo "Board name: $board_name"
board_config_label="$(fx-command-run jq -r ".[] | select(.name == \"$board_name\") | .label" "$FUCHSIA_BUILD_DIR/boards.json")"
if [[ -z "$board_config" ]]; then
if [[ -n "$board_config_label" ]]; then
echo "Using board config label: $board_config_label"
# Change : to / and remove the trailing toolchain parens
board_config_path=${board_config_label//:/\/}
board_config_path=${board_config_path%(*}
board_config=$FUCHSIA_BUILD_DIR/obj/${board_config_path:2}
echo "Using board config: $board_config"
else
echo "Error: Could not find board_config_label in metadata for $main_pb_label. Please run fx build and make sure the board you're using is built."
exit 1
fi
fi
# Validate files exist
if [[ ! -d "$input_bundles_dir" ]]; then
# We'll let the tool fail if it's not a directory, but warn here.
echo "Warning: Input bundles directory not found at $input_bundles_dir. Tool might fail."
fi
echo "Using Input Bundles Dir: $input_bundles_dir"
if [[ -n "$product_config" ]]; then
echo "Using Product Config: $product_config"
fi
if [[ -n "$board_config" ]]; then
echo "Using Board Config: $board_config"
fi
developer_overrides="$FUCHSIA_BUILD_DIR/obj/build/images/build_zbi_developer_overrides.json"
if [[ -f "$developer_overrides" ]]; then
rm "$developer_overrides"
fi
# Build the platform artifacts
echo "Building platform artifacts..."
build_targets=("//bundles/assembly")
build_targets+=("${board_config_label}")
build_targets+=("${main_pb_label}_product_config")
build_targets+=("//build/images:developer_overrides_list")
echo "Invoking fx build with targets: ${build_targets[*]}"
fx-command-run build "${build_targets[@]}"
echo "fx build finished."
# Run the tool
outdir="$FUCHSIA_BUILD_DIR/obj/build/images/fuchsia/build_zbi"
mkdir -p "$outdir"
echo "Running ffx product-bundle create..."
# We need to use the ffx from the build directory to ensure we have the plugin changes.
ffx_path="$FUCHSIA_BUILD_DIR/host_x64/ffx"
if [[ ! -x "$ffx_path" ]]; then
# Fallback/Check for arm64
ffx_path="$FUCHSIA_BUILD_DIR/host_arm64/ffx"
fi
if [[ ! -x "$ffx_path" ]]; then
echo "Error: Could not find ffx at $ffx_path"
exit 1
fi
ffx_args=()
if [[ -n "$developer_overrides" && -f "$developer_overrides" ]]; then
echo "Using Developer Overrides: $developer_overrides"
ffx_args+=(--developer-overrides "$developer_overrides")
fi
"$ffx_path" product-bundle create \
--product-config "$product_config" \
--board-config "$board_config" \
--out "$outdir" \
--platform "$input_bundles_dir" \
--zbi-only \
--auth no-auth \
"${ffx_args[@]}"
echo "You can now flash the kernel with fastboot."