| #!/bin/bash |
| |
| # Copyright 2022 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. |
| |
| set -e |
| |
| # This script is used to fetch the prebuilt that is needed by driver build. |
| |
| readonly REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." >/dev/null 2>&1 && pwd)" |
| readonly BAZELISK_TOOL="${REPO_ROOT}/tools/bazel" |
| readonly OVERRIDE_SDK="${REPO_ROOT}/fuchsia_sdk.tar.gz" |
| readonly WORKSPACE_NAME="$(basename "$REPO_ROOT")" |
| readonly SDK_WORKSPACE_DIR="${REPO_ROOT}/bazel-${WORKSPACE_NAME}/external/fuchsia_sdk" |
| |
| function get_os { |
| uname -s | tr '[:upper:]' '[:lower:]' |
| } |
| |
| function get_arch { |
| local ARCH="$(uname -m)" |
| case "${ARCH}" in |
| x86_64) |
| ARCH=amd64 |
| ;; |
| aarch64) |
| ARCH=arm64 |
| ;; |
| esac |
| echo "$ARCH" |
| } |
| |
| create_symlink() { |
| local TOOL |
| TOOL="$1" |
| SYMLINK="$2" |
| mkdir -p "$(dirname "${SYMLINK}")" |
| ln -f -s "${TOOL}" "${SYMLINK}" |
| } |
| |
| create_bazel_symlink() { |
| local BAZELISK_BIN="${REPO_ROOT}/vendor/bazelisk/bazelisk-$(get_os)-$(get_arch)" |
| if [[ ! -x "${BAZELISK_BIN}" ]]; then |
| >&2 echo "Bazel wrapper not supported in this OS/architecture. Could not find executable: ${BAZELISK_BIN}" |
| exit 1 |
| fi |
| create_symlink "$BAZELISK_BIN" "$BAZELISK_TOOL" |
| } |
| |
| create_tools_symlinks() { |
| create_symlink "${SDK_WORKSPACE_DIR}/tools/x64/ffx" ${REPO_ROOT}/tools/ffx |
| } |
| |
| # TODO: this is probably not needed when the DDK becomes part of the core SDK. |
| update_sdk_from_archive() { |
| SDK_ARCHIVE="$1" |
| if [[ ! -f "$SDK_ARCHIVE" ]]; then |
| echo "ERROR: sdk archive cannot be found: $SDK_ARCHIVE" |
| exit 1 |
| fi |
| echo "Copying SDK archive to ${OVERRIDE_SDK}..." |
| rsync --checksum "$SDK_ARCHIVE" "$OVERRIDE_SDK" |
| echo "Done copying SDK archive." |
| } |
| |
| # TODO: this is probably not needed when the DDK becomes part of the core SDK. |
| update_sdk_from_local_build() { |
| SDK_OUT="$1" |
| PBM_OUT="$2" |
| if [[ ! -d "$SDK_OUT" ]]; then |
| echo "ERROR: cannot find a directory in $SDK_OUT" |
| exit 1 |
| fi |
| if [[ ! -d "$PBM_OUT" ]]; then |
| echo "ERROR: cannot find a directory in $PBM_OUT" |
| exit 1 |
| fi |
| |
| PBM_FILES=( |
| $PBM_OUT/./gen/build/images/virtual_device.json |
| $PBM_OUT/./gen/build/images/emulator_flags.json.template |
| $PBM_OUT/./gen/build/images/product_bundle.json |
| $PBM_OUT/./obj/build/images/fuchsia/fuchsia/fvm.blk |
| $PBM_OUT/./multiboot.bin |
| $PBM_OUT/./fuchsia.zbi |
| $SDK_OUT/./amber-files |
| ) |
| SDK_ARCHIVE="${SDK_OUT}/sdk/archive/core.tar.gz" |
| DDK_ARCHIVE="${SDK_OUT}/sdk/archive/ddk.tar.gz" |
| if [[ ! -f "$SDK_ARCHIVE" ]]; then |
| echo "ERROR: cannot find the core SDK archive, make sure your 'fx set' has" |
| echo " '--args=build_sdk_archives=true' and that you build" |
| echo " 'fx build :default sdk sdk:ddk': $SDK_ARCHIVE" |
| exit 1 |
| fi |
| if [[ ! -f "$DDK_ARCHIVE" ]]; then |
| echo "ERROR: cannot find the DDK archive, make sure your 'fx set' has" |
| echo " '--args=build_sdk_archives=true' and that you build" |
| echo " 'fx build :default sdk sdk:ddk': $DDK_ARCHIVE" |
| exit 1 |
| fi |
| |
| for f in "${PBM_FILES[@]}"; do |
| if [[ ! -e "$f" ]]; then |
| echo "ERROR: cannot find file needed to run the emulator. Make sure your" |
| echo " 'fx set' does NOT have '--args=build_sdk_archives=true'" |
| echo " and that you build with 'fx build :default sdk': $f" |
| exit 1 |
| fi |
| done |
| |
| if [[ -d "$OVERRIDE_SDK" ]]; then |
| echo "Removing old SDK in $OVERRIDE_SDK" |
| rm -f "$OVERRIDE_SDK" |
| fi |
| |
| echo "Syncing SDK from local build..." |
| TMP_CORE_DIR="$(mktemp -d)" |
| TMP_DDK_DIR="$(mktemp -d)" |
| tar xzf "${SDK_OUT}/sdk/archive/core.tar.gz" -C "${TMP_CORE_DIR}" |
| tar xzf "${SDK_OUT}/sdk/archive/ddk.tar.gz" -C "${TMP_DDK_DIR}" |
| mv "${TMP_DDK_DIR}/meta/manifest.json" "${TMP_DDK_DIR}/meta/ddk_manifest.json" |
| |
| rsync -aR "${PBM_FILES[@]}" "$TMP_CORE_DIR" |
| tar czvf "$OVERRIDE_SDK" -C "$TMP_CORE_DIR" . -C "$TMP_DDK_DIR" . |
| rm -Rf "$TMP_CORE_DIR" "$TMP_DDK_DIR" |
| echo "Done syncing SDK from local build." |
| } |
| |
| syntax() { |
| echo " $(basename $0)" |
| echo " fetch from CIPD the SDK defined in WORKSPACE.bazel or use" |
| echo " ${OVERRIDE_SDK##REPO_ROOT/} if one is present." |
| echo |
| echo " $(basename $0) --sdk-archive SDK_TARGZ" |
| echo " load an SDK and the emulator product bundle files from the" |
| echo " given tar.gz archive. See README.md on how to generate this archive." |
| echo |
| echo " $(basename $0) --sdk-local FUCHSIA_OUT_SDK --product-bundle-local FUCHSIA_OUT_PRODUCT_BUNDLE" |
| echo " copy the SDK from a build directory of a local Fuchsia tree," |
| echo " and copy the product bundle files for the emulator from another" |
| echo " build directory. See README.md for more information." |
| } |
| |
| main() { |
| if [[ $# -gt 0 ]]; then |
| if [[ "$1" == "--sdk-archive" && $# -eq 2 ]]; then |
| update_sdk_from_archive "$2" |
| elif [[ $# -eq 4 && "$1" == "--sdk-local" && "$3" == "--product-bundle-local" ]]; then |
| update_sdk_from_local_build $2 $4 |
| elif [[ $# -eq 4 && "$3" == "--sdk-local" && "$1" == "--product-bundle-local" ]]; then |
| update_sdk_from_local_build $4 $2 |
| else |
| echo "Invalid syntax." |
| syntax |
| exit 1 |
| fi |
| fi |
| |
| create_bazel_symlink |
| create_tools_symlinks |
| # symlink to compile commands |
| ln -f -s "${REPO_ROOT}/bazel-bin/src/compile_commands.json" "${REPO_ROOT}/compile_commands.json" |
| } |
| |
| main "$@" |