#!/usr/bin/env bash set -euo pipefail echo "Initializing development environment..." export DEV_HOME="$HOME" export DEV_USER="$(basename "$DEV_HOME")" # ----------------------------------------------------------------------------- # Software directories # ----------------------------------------------------------------------------- mkdir -p /opt/rustup /opt/cargo /opt/aseprite chown "$DEV_USER:$DEV_USER" /opt/rustup /opt/cargo /opt/aseprite # ----------------------------------------------------------------------------- # Fish configuration # ----------------------------------------------------------------------------- mkdir -p /etc/fish/conf.d mkdir -p /etc/fish/completions tee /etc/fish/conf.d/rust.fish >/dev/null <<'EOF' set -gx RUSTUP_HOME /opt/rustup set -gx CARGO_HOME /opt/cargo fish_add_path $CARGO_HOME/bin EOF # ----------------------------------------------------------------------------- # Rustup # ----------------------------------------------------------------------------- export RUSTUP_HOME=/opt/rustup export CARGO_HOME=/opt/cargo if [[ ! -x /opt/cargo/bin/rustup ]]; then echo "Installing rustup..." curl \ --proto '=https' \ --tlsv1.2 \ -sSf \ https://sh.rustup.rs \ | sh -s -- -y --no-modify-path else echo "rustup is already installed." fi # Rust toolchain echo "Installing stable Rust toolchain..." /opt/cargo/bin/rustup default stable # Fish completions echo "Installing rustup Fish completion..." /opt/cargo/bin/rustup completions fish \ | tee /etc/fish/completions/rustup.fish >/dev/null # ----------------------------------------------------------------------------- # Aseprite # ----------------------------------------------------------------------------- if [[ -f /opt/aseprite/aseprite.desktop ]]; then echo "Aseprite desktop entry already exists; skipping installation." else if [[ ! -d /opt/aseprite ]]; then echo "Cloning Aseprite..." git clone --recursive https://github.com/aseprite/aseprite.git /opt/aseprite else echo "Aseprite source already exists." fi cd /opt/aseprite if [[ ! -x /opt/aseprite/build/bin/aseprite ]]; then git submodule update --init --recursive echo "Building Aseprite..." ./build.sh --auto --norun else echo "Aseprite is already built." fi echo "Creating Aseprite desktop entry..." cat > /opt/aseprite/aseprite.desktop <<'EOF' [Desktop Entry] Name=Aseprite Comment=Animated sprite editor Exec=/opt/aseprite/build/bin/aseprite %F Icon=/opt/aseprite/build/bin/data/icons/ase.ico Terminal=false Type=Application Categories=Graphics;2DGraphics; EOF fi if sudo -u "$DEV_USER" env HOME="$DEV_HOME" distrobox-export --list-apps 2>/dev/null | grep -Fq "aseprite" then echo "Aseprite desktop entry is already exported." else echo "Exporting Aseprite desktop entry..." sudo -u "$DEV_USER" env HOME="$DEV_HOME" distrobox-export --app /opt/aseprite/aseprite.desktop fi # ----------------------------------------------------------------------------- # Export development tools to the host # ----------------------------------------------------------------------------- export PATH="/opt/cargo/bin:$PATH" echo "Exporting development tools..." export_bin() { local binary="$1" if ! command -v "$binary" >/dev/null 2>&1; then echo " warning: $binary not found" elif sudo -u "$DEV_USER" env HOME="$DEV_HOME" \ distrobox-export \ --list-binaries \ --export-path "$DEV_HOME/.local/bin" 2>/dev/null | awk -F'|' -v binary="$binary" ' { name = $1 gsub(/^[[:space:]]+|[[:space:]]+$/, "", name) if (name == binary) { found = 1 } } END { exit !found } ' then echo " $binary is already exported." else echo " exporting $binary" sudo -u "$DEV_USER" \ env HOME="$DEV_HOME" \ distrobox-export \ --bin "$(command -v "$binary")" \ --export-path "$DEV_HOME/.local/bin" fi } # Rust for binary in \ cargo \ cargo-clippy \ cargo-fmt \ cargo-miri \ clippy-driver \ rls \ rust-analyzer \ rustc \ rustdoc \ rustfmt \ rust-gdb \ rust-gdbgui \ rust-lldb \ rustup do export_bin "$binary" done # Native toolchain export_bin clang export_bin clang++ export_bin cmake export_bin pkg-config export_bin ninja export_bin lld export_bin ld.lld export_bin gdb export_bin strace # ----------------------------------------------------------------------------- # Done # ----------------------------------------------------------------------------- echo echo "Development environment initialized successfully." echo echo "Rust:" /opt/cargo/bin/rustc --version /opt/cargo/bin/cargo --version /opt/cargo/bin/rustup --version