#!/usr/bin/env bash set -euo pipefail # Reproducible Linux x86_64 SoC generation tool setup. # Installs only host-side Scala/Chisel/CIRCT tools. The RISC-V bare-metal # toolchain remains an external dependency selected by source.sh. TOOLS_ROOT="${SOC_TOOLS_ROOT:-/tools/soc-tools}" JDK_VERSION="17.0.19+10" MILL_VERSION="0.11.1" FIRTOOL_VERSION="1.151.0" Z3_VERSION="4.16.0" JDK_ARCHIVE="OpenJDK17U-jdk_x64_linux_hotspot_17.0.19_10.tar.gz" JDK_URL="https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.19%2B10/$JDK_ARCHIVE" JDK_SHA256="d8afc263758141a66e0e3aafc321e783f7016696f4eaea067d340a269037d331" MILL_URL="https://github.com/com-lihaoyi/mill/releases/download/$MILL_VERSION/$MILL_VERSION" MILL_SHA256="ebe83649cd63acd33608f6d14452c074be2ed7d00cd2f69f88573d3f6909774f" CIRCT_ARCHIVE="circt-full-shared-linux-x64.tar.gz" CIRCT_URL="https://github.com/llvm/circt/releases/download/firtool-$FIRTOOL_VERSION/$CIRCT_ARCHIVE" CIRCT_SHA256="dde442dcd0ada92e6f7db26f4744667471f7be61d10f2876297efb435fc9a5ec" Z3_ARCHIVE="z3-$Z3_VERSION-x64-glibc-2.39.zip" Z3_URL="https://github.com/Z3Prover/z3/releases/download/z3-$Z3_VERSION/$Z3_ARCHIVE" Z3_SHA256="7288c49a5bd6dbafd7b0b0d1f65956b91672da24b08f09242919af159be3418e" if [[ "$(uname -s)" != Linux || "$(uname -m)" != x86_64 ]]; then printf 'Unsupported host: %s-%s (this lock file is for Linux-x86_64)\n' "$(uname -s)" "$(uname -m)" >&2 exit 2 fi for command_name in curl sha256sum tar unzip find; do command -v "$command_name" >/dev/null || { printf 'Missing required command: %s\n' "$command_name" >&2 exit 2 } done if [[ -w "$(dirname "$TOOLS_ROOT")" ]] || [[ -w "$TOOLS_ROOT" ]]; then SUDO=() else command -v sudo >/dev/null || { printf '%s is not writable and sudo is unavailable\n' "$TOOLS_ROOT" >&2 exit 2 } SUDO=(sudo) fi work_dir="$(mktemp -d "${TMPDIR:-/tmp}/soc-tools.XXXXXXXX")" trap 'rm -rf "$work_dir"' EXIT download() { local url="$1" output="$2" sha256="$3" printf 'Downloading %s\n' "$(basename "$output")" curl --fail --location --retry 3 --output "$output" "$url" printf '%s %s\n' "$sha256" "$output" | sha256sum --check --status || { printf 'Checksum mismatch: %s\n' "$output" >&2 exit 1 } } install_tree() { local source_dir="$1" destination="$2" "${SUDO[@]}" rm -rf "$destination.tmp" "${SUDO[@]}" mkdir -p "$(dirname "$destination")" "${SUDO[@]}" cp -a "$source_dir" "$destination.tmp" "${SUDO[@]}" rm -rf "$destination" "${SUDO[@]}" mv "$destination.tmp" "$destination" } "${SUDO[@]}" mkdir -p "$TOOLS_ROOT" if [[ ! -x "$TOOLS_ROOT/jdks/jdk-$JDK_VERSION/bin/java" ]]; then download "$JDK_URL" "$work_dir/$JDK_ARCHIVE" "$JDK_SHA256" mkdir -p "$work_dir/jdk" tar -xzf "$work_dir/$JDK_ARCHIVE" -C "$work_dir/jdk" install_tree "$work_dir/jdk/jdk-$JDK_VERSION" "$TOOLS_ROOT/jdks/jdk-$JDK_VERSION" fi if [[ ! -x "$TOOLS_ROOT/mill/$MILL_VERSION/mill" ]]; then download "$MILL_URL" "$work_dir/mill" "$MILL_SHA256" "${SUDO[@]}" mkdir -p "$TOOLS_ROOT/mill/$MILL_VERSION" "${SUDO[@]}" install -m 0755 "$work_dir/mill" "$TOOLS_ROOT/mill/$MILL_VERSION/mill" fi if [[ ! -x "$TOOLS_ROOT/circt/firtool-$FIRTOOL_VERSION/bin/firtool" ]]; then download "$CIRCT_URL" "$work_dir/$CIRCT_ARCHIVE" "$CIRCT_SHA256" mkdir -p "$work_dir/circt" tar -xzf "$work_dir/$CIRCT_ARCHIVE" -C "$work_dir/circt" firtool_path="$(find "$work_dir/circt" -type f -path '*/bin/firtool' -print -quit)" [[ -n "$firtool_path" ]] || { printf 'firtool not found in CIRCT archive\n' >&2; exit 1; } install_tree "$(dirname "$(dirname "$firtool_path")")" "$TOOLS_ROOT/circt/firtool-$FIRTOOL_VERSION" fi if [[ ! -f "$TOOLS_ROOT/z3/$Z3_VERSION/bin/libz3.so" ]]; then download "$Z3_URL" "$work_dir/$Z3_ARCHIVE" "$Z3_SHA256" mkdir -p "$work_dir/z3" unzip -q "$work_dir/$Z3_ARCHIVE" -d "$work_dir/z3" z3_path="$(find "$work_dir/z3" -type f -path '*/bin/libz3.so' -print -quit)" [[ -n "$z3_path" ]] || { printf 'libz3.so not found in Z3 archive\n' >&2; exit 1; } install_tree "$(dirname "$(dirname "$z3_path")")" "$TOOLS_ROOT/z3/$Z3_VERSION" fi "${SUDO[@]}" ln -sfn "jdks/jdk-$JDK_VERSION" "$TOOLS_ROOT/jdk17" "${SUDO[@]}" ln -sfn "mill/$MILL_VERSION/mill" "$TOOLS_ROOT/mill-current" "${SUDO[@]}" ln -sfn "circt/firtool-$FIRTOOL_VERSION" "$TOOLS_ROOT/circt-current" "${SUDO[@]}" ln -sfn "z3/$Z3_VERSION" "$TOOLS_ROOT/z3-current" printf '\nInstalled SoC tools in %s\n' "$TOOLS_ROOT" printf 'Run: source %q/source.sh && make doctor\n' "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"