#!/bin/bash # Docker-based Linux build wrapper # Runs build-linux-ubuntu.sh inside a reproducible container # # --platform linux/amd64 is forced on both build and run: the Linux target is # x86_64-only end to end (bundle-python.sh's python-build-standalone pin, # vgmstream, onnxruntime, etc. have no arm64 Linux build, and Steam Deck # itself is x86_64). On an Apple Silicon host, omitting --platform makes # `docker build` produce a native arm64 image, so bundle-python.sh's hardcoded # x86_64 download becomes a foreign-arch binary inside an otherwise-native # container — Rosetta chokes trying to exec it directly instead of via full # amd64 emulation. Forcing amd64 for the whole container sidesteps that. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" DEVCONTAINER_DIR="$PROJECT_DIR/.devcontainer" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' echo "=== Slopsmith Desktop Docker Build ===" echo "" echo "This script provides reproducible Linux builds by running" echo "build-linux-ubuntu.sh inside a Docker container." echo "" # Check prerequisites echo -e "${BLUE}Checking prerequisites...${NC}" if ! command -v docker &>/dev/null; then echo -e "${RED}Error: Docker is not installed${NC}" >&2 echo "Install: https://docs.docker.com/get-docker/" >&2 exit 1 fi if ! docker info &>/dev/null; then echo -e "${RED}Error: Docker daemon is not running${NC}" >&2 exit 1 fi echo -e "${GREEN}✓${NC} Docker available" echo "" # Build container image echo -e "${BLUE}Building container image...${NC}" echo " (This will take a few minutes on first run)" echo "" docker build \ --platform linux/amd64 \ -f "$DEVCONTAINER_DIR/Dockerfile" \ -t slopsmith-ubuntu-builder \ "$PROJECT_DIR" # `set -e` at the top of this script already aborts on a failed # `docker build` — no manual `$?` check needed (and the check that # was here would in practice be unreachable). echo -e "${GREEN}✓${NC} Container image built" echo "" # Clear stale CMake build cache. CMakeCache.txt bakes in the build path; # when the project is mounted at a different path inside the container the # paths don't match and cmake aborts. A clean build/ guarantees consistency. if [[ -d "$PROJECT_DIR/build" ]]; then echo -e "${BLUE}Clearing stale CMake cache...${NC}" rm -rf "$PROJECT_DIR/build" fi # Generate unique container name CONTAINER_NAME="slopsmith-build-$(date +%s)-$$-$RANDOM" echo -e "${BLUE}Running build in container...${NC}" echo -e "${BLUE}Container name:${NC} $CONTAINER_NAME" echo "" echo "The container will be preserved after the build to allow debugging." echo "Clean up when done:" echo " docker stop $CONTAINER_NAME && docker rm $CONTAINER_NAME" echo "" set +e docker run \ --platform linux/amd64 \ --name "$CONTAINER_NAME" \ -v "$PROJECT_DIR:/workspace" \ -w /workspace \ -e ELECTRON_CACHE=/home/vscode/.cache/electron \ -e ELECTRON_BUILDER_CACHE=/home/vscode/.cache/electron-builder \ -e GIT_TERMINAL_PROMPT=0 \ -e "GH_CLONE_TOKEN=${GH_CLONE_TOKEN:-}" \ -e "SLOPSMITH_REF=${SLOPSMITH_REF:-main}" \ -e "SLOPSMITH_REPO=${SLOPSMITH_REPO:-got-feedback/feedback}" \ -t \ slopsmith-ubuntu-builder \ bash -c './scripts/build-linux-ubuntu.sh' BUILD_EXIT_CODE=$? set -e echo "" if [[ $BUILD_EXIT_CODE -eq 0 ]]; then echo -e "${GREEN}✓${NC} Build completed successfully!" else echo -e "${RED}✗${NC} Build failed (exit code: $BUILD_EXIT_CODE)" echo "" echo "To debug:" echo " docker exec -it $CONTAINER_NAME /bin/bash" echo " docker logs $CONTAINER_NAME" echo "" fi exit $BUILD_EXIT_CODE