#!/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

sudo apt-get install --yes --no-install-recommends \
    black \
    ca-certificates \
    clang \
    cloud-image-utils \
    curl \
    dpkg-dev \
    expect \
    g++ \
    gcc \
    git \
    jq \
    libasound2-dev \
    libavcodec-dev \
    libavutil-dev \
    libcap-dev \
    libclang-dev \
    libdbus-1-dev \
    libdrm-dev \
    libepoxy-dev \
    libglib2.0-dev \
    libguestfs-tools \
    libslirp-dev \
    libssl-dev \
    libswscale-dev \
    libva-dev \
    libwayland-dev \
    libxext-dev \
    make \
    meson \
    mypy \
    nasm \
    ncat \
    ninja-build \
    openssh-client \
    pipx \
    pkg-config \
    protobuf-compiler \
    python3 \
    python3-argh \
    python3-pip \
    python3-rich \
    qemu-system-x86 \
    rsync \
    screen \
    strace \
    tmux \
    wayland-protocols \
    wget

# mdformat is not available as a debian package. Install via pipx instead.
pipx install mdformat
pipx inject mdformat mdformat-gfm mdformat-footnote
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

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

# Note: Using crate-meta-data will make too many requests to github to discover which release
# to download. This will get throttled quickly and slow down massively.
# This should be fixed by: https://github.com/cargo-bins/cargo-binstall/issues/776

# The bindgen tool is required to build a crosvm dependency.
cargo binstall --no-confirm --disable-strategies crate-meta-data bindgen-cli --version "0.64.0"

# binutils are wrappers to call the rustup bundled versions of llvm tools.
cargo binstall --no-confirm --disable-strategies crate-meta-data cargo-binutils

# The mdbook and mdbook-mermaid tools are used to build the crosvm book.
cargo binstall --no-confirm --disable-strategies crate-meta-data mdbook --version "0.4.25"
cargo binstall --no-confirm --disable-strategies crate-meta-data mdbook-mermaid --version "0.12.6"
cargo binstall --no-confirm --disable-strategies crate-meta-data mdbook-linkcheck --version "0.7.7"

# Nextest is an improved test runner for cargo
cargo binstall --no-confirm --disable-strategies crate-meta-data cargo-nextest --version "0.9.49"
