#!/usr/bin/env bash
# Copyright 2021 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
set -ex

# mdformat is not available as a debian package. Install via pipx instead.
pipx install mdformat
pipx inject mdformat mdformat-gfm mdformat-footnote mdformat_frontmatter
pipx ensurepath

# Install rustup if not available yet
if ! command -v rustup &>/dev/null; then
    wget "https://static.rust-lang.org/rustup/archive/1.25.1/x86_64-unknown-linux-gnu/rustup-init"
    echo "5cc9ffd1026e82e7fb2eec2121ad71f4b0f044e88bca39207b3f6b769aaa799c *rustup-init" | sha256sum -c -
    chmod +x rustup-init
    ./rustup-init -y --no-modify-path --profile minimal --default-toolchain none
    source ${CARGO_HOME:-~/.cargo}/env
    rm rustup-init
fi

# Install required rust components.
# This will also ensure the toolchain required by ./rust-toolchain is installed.
rustup component add cargo clippy rustfmt

# LLVM tools are used to generate and process coverage files
rustup component add llvm-tools-preview

# Allow cross-compilation via mingw64
rustup target add x86_64-pc-windows-gnu

# Allow cross-compilation for android
rustup target add aarch64-linux-android

# Install nightly toolchain. Only used for rustfmt
rustup toolchain install nightly --profile minimal --component rustfmt

# Cargo extension to install binary packages from github
curl -L https://github.com/cargo-bins/cargo-binstall/releases/download/v1.4.4/cargo-binstall-x86_64-unknown-linux-gnu.tgz | tar -xzvvf - -C ${CARGO_HOME:-~/.cargo}/bin

# Install linuxdeploy if not already available
if ! command -v linuxdeploy &>/dev/null; then
    BIN_DIR="${PIPX_BIN_DIR:-$HOME/.local/bin}"
    mkdir -p "$BIN_DIR"
    curl -L -o "$BIN_DIR/linuxdeploy" https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20251107-1/linuxdeploy-x86_64.AppImage
    chmod +x "$BIN_DIR/linuxdeploy"
fi

# The bindgen tool is required to build a crosvm dependency.
cargo binstall --no-confirm bindgen-cli --version "0.71.0"

# The mdbook tools are used to build the crosvm book.
cargo binstall --no-confirm mdbook --version "0.4.25"
cargo binstall --no-confirm mdbook-linkcheck --version "0.7.7"

# Nextest is an improved test runner for cargo
cargo binstall --no-confirm cargo-nextest --version "0.9.96"

# cargo-binutils provides cargo-strip
cargo binstall --no-confirm cargo-binutils --version "0.4.0"

# Kani Rust Verifier for formal verification
cargo install --locked kani-verifier --version "0.68.0"
cargo kani setup

Red='\033[0;31m'
Reset='\033[0m'
# Check if submodules were initialized. If a submodule is not initialized, git
# submodule status will be prefixed with `-`
if git submodule status | grep '^-'; then
    >&2 echo -e "${Red}ERROR${Reset}: Git modules were not initialized. Run 'git submodule update --init' to initialize them."
fi
