From b68bb4b8823dcd7c811159f9b77865bcd9a4e6e0 Mon Sep 17 00:00:00 2001 From: Grant Date: Thu, 18 Jun 2026 14:46:22 -0500 Subject: [PATCH] Add prepare.sh build bootstrap for clean Debian box Start9's build-from-source flow needs every host prerequisite installed before 'make' runs. Add a bootstrap mirroring the official 0.4.0.x environment-setup page: apt prereqs, Node 22, Docker (+binfmt for cross-arch), and start-cli via the official installer. Rust stays inside the package Dockerfile, not the host. --- prepare.sh | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100755 prepare.sh diff --git a/prepare.sh b/prepare.sh new file mode 100755 index 0000000..6b7ffc6 --- /dev/null +++ b/prepare.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# prepare.sh — bootstrap a clean Debian/Ubuntu box to build the Keysat s9pk. +# +# Start9's build-from-source flow clones this repo onto a fresh box, then runs a +# bootstrap script followed by `make`. This installs every HOST prerequisite that +# `make` needs (npm → wrapper bundle; start-cli s9pk pack → Docker image build). +# It mirrors the official StartOS 0.4.0.x environment-setup page: +# https://docs.start9.com/packaging/0.4.0.x/environment-setup.html +# +# Note: `prepare.sh` is a 0.3.5.x community-submission convention; the 0.4.x docs +# don't mention it, so the 0.4.x submission flow may not invoke it. This file is +# still the runnable, single-source record of what a clean build box needs. +# +# The Rust daemon is NOT built on the host — it compiles inside this package's +# Dockerfile (FROM rust:1.88-slim-bookworm), so no rustup/cargo is installed here. +# +# Idempotent: re-running skips tools already present. Targets apt-based distros. + +set -euo pipefail + +# Use sudo only when not already root (Start9's build box may run either way). +SUDO="" +if [ "$(id -u)" -ne 0 ]; then + SUDO="sudo" +fi + +NODE_MAJOR=22 + +log() { printf '\n\033[1;36m==> %s\033[0m\n' "$*"; } + +# --- apt prerequisites ------------------------------------------------------- +# build-essential → make/gcc; squashfs-tools(-ng) → start-cli s9pk packing; +# jq → used by s9pk.mk's build summary; git → the s9pk embeds the commit hash. +log "Installing apt prerequisites (make, jq, git, squashfs, curl)" +$SUDO apt-get update +$SUDO apt-get install -y --no-install-recommends \ + build-essential \ + ca-certificates \ + curl \ + git \ + jq \ + squashfs-tools \ + squashfs-tools-ng + +# --- Node.js 22 -------------------------------------------------------------- +# The wrapper (@start9labs/start-sdk + @vercel/ncc bundle) needs Node 22. We +# install it system-wide via NodeSource so it's on PATH for the non-interactive +# `make` that follows (the docs' nvm method would need a shell rc sourced first). +if command -v node >/dev/null 2>&1 && node -v | grep -q "^v${NODE_MAJOR}\."; then + log "Node.js $(node -v) already present — skipping" +else + log "Installing Node.js ${NODE_MAJOR} (NodeSource)" + curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | $SUDO -E bash - + $SUDO apt-get install -y nodejs +fi + +# --- Docker (+ buildx) ------------------------------------------------------- +# start-cli s9pk pack builds the daemon image from the Dockerfile via Docker +# buildx. get.docker.com is Docker's official installer and bundles the buildx +# plugin. +if command -v docker >/dev/null 2>&1; then + log "Docker $(docker --version | awk '{print $3}' | tr -d ,) already present — skipping" +else + log "Installing Docker (official get.docker.com installer)" + curl -fsSL https://get.docker.com | $SUDO sh +fi + +# Cross-architecture builds (`make universal` / `make arm` on an x86 host) need +# QEMU binfmt handlers registered. Best-effort: requires the Docker daemon to be +# running. Harmless to skip if you only build the host's native arch (`make x86`). +if $SUDO docker info >/dev/null 2>&1; then + log "Registering QEMU binfmt handlers for cross-arch builds (best-effort)" + $SUDO docker run --privileged --rm tonistiigi/binfmt --install all || + echo " (binfmt registration skipped — only native-arch builds will work)" +else + echo " (Docker daemon not reachable yet — skipping binfmt setup; start Docker" + echo " and re-run this script if you need cross-arch/universal builds.)" +fi + +# --- start-cli (StartOS 0.4.x SDK) ------------------------------------------- +# Official installer: fetches the latest prebuilt binary into ~/.local/bin. +# For a reproducible build, pin a release instead, e.g.: +# curl -fsSLo ~/.local/bin/start-cli \ +# https://github.com/Start9Labs/start-os/releases/download//start-cli_x86_64-linux +# chmod +x ~/.local/bin/start-cli +if command -v start-cli >/dev/null 2>&1; then + log "start-cli $(start-cli --version 2>/dev/null | awk '{print $2}') already present — skipping" +else + log "Installing start-cli (StartOS 0.4.x SDK)" + curl -fsSL https://start9.com/start-cli/install.sh | sh +fi + +# The installer drops start-cli in ~/.local/bin and appends it to your shell rc. +# Persist it to .profile for future shells (only if not already recorded, so +# re-runs don't pile up duplicates), and export it for the rest of THIS session. +if ! grep -qsF '.local/bin' "${HOME}/.profile"; then + echo 'export PATH="$HOME/.local/bin:$PATH"' >>"${HOME}/.profile" +fi +export PATH="${HOME}/.local/bin:${PATH}" + +log "Done. Initialise your signing key with 'start-cli init', then run 'make' (or 'make x86')."