juegos

Juegos de terminal de Pancho: Catan (TUI, GUI, web, servidor, PicoCalc), ajedrez, calculadora y minijuegos
git clone https://git.lu3dhn.xyz/juegos.git
Log | Files | Refs

linux-release.sh (4672B)


      1 #!/bin/sh
      2 # Compila el catan de Linux para repartir: un solo archivo que corre en la mayoria de las
      3 # distros. Se compila dentro de un Ubuntu 22.04 (docker) porque un binario de Linux solo
      4 # corre en sistemas con una libc igual o mas nueva que la de donde se compilo; la de la X1
      5 # es muy nueva. SDL3 y ncurses van adentro (estaticos); lo grafico (X11/Wayland, audio) SDL
      6 # lo busca al arrancar en la compu de cada uno.
      7 #
      8 # La imagen $IMAGE (Ubuntu 22.04 + herramientas + SDL3 estatico en /opt/sdl) se arma una
      9 # sola vez, con la fuente de SDL3 (tarda ~10 min); despues cada release solo compila Catan
     10 # (segundos). Para rearmarla (otra SDL3): docker rmi catan-release:ubuntu22.04.
     11 #
     12 # Docker corre en esta compu (en la X1 pancho no esta en el grupo docker: se usa sudo con el
     13 # popup de sudo-askpass), o en RELEASE_HOST por ssh (ej. RELEASE_HOST=ct112-remoto, que tiene
     14 # docker y entramos como root; ahi la imagen queda armada en ese host y no hace falta sudo).
     15 # Uso: tools/linux-release.sh <version> <salida>   (lo llama make release)
     16 set -e
     17 VERSION=$1; OUT=$2
     18 if [ -z "$VERSION" ] || [ -z "$OUT" ]; then
     19     echo "uso: $0 <version> <salida>" >&2
     20     exit 1
     21 fi
     22 HOST=${RELEASE_HOST:-local}
     23 IMAGE=catan-release:ubuntu22.04
     24 SDL_SRC=${WIN_SDL_SRC:-$HOME/.local/opt/src/SDL3-3.4.16}
     25 ROOT=$(cd "$(dirname "$0")/../.." && pwd)
     26 
     27 # la imagen: Ubuntu 22.04 con lo necesario para compilar y SDL3 estatico instalado
     28 DOCKERFILE='FROM ubuntu:22.04
     29 ENV DEBIAN_FRONTEND=noninteractive
     30 RUN apt-get update -qq && apt-get install -y -qq build-essential cmake ninja-build pkg-config libncurses-dev \
     31     libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxss-dev libxfixes-dev libxtst-dev \
     32     libwayland-dev libxkbcommon-dev wayland-protocols libegl-dev libgl-dev libdecor-0-dev \
     33     libasound2-dev libpulse-dev libdrm-dev libgbm-dev >/dev/null && rm -rf /var/lib/apt/lists/*
     34 COPY . /sdl
     35 RUN cmake -S /sdl -B /tmp/sdl -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/sdl \
     36     -DSDL_SHARED=OFF -DSDL_STATIC=ON -DSDL_TESTS=OFF -DSDL_EXAMPLES=OFF >/dev/null \
     37     && cmake --build /tmp/sdl >/dev/null && cmake --install /tmp/sdl >/dev/null && rm -rf /tmp/sdl /sdl'
     38 
     39 # lo que corre dentro del contenedor: /src el repo, /out la salida
     40 BUILD='set -e
     41 cp -r /src /tmp/j && cd /tmp/j/catan && rm -f catan
     42 make catan VERSION="$VERSION" CFLAGS="-O2" \
     43     SDL="$(PKG_CONFIG_PATH=/opt/sdl/lib/pkgconfig pkg-config --cflags --static --libs sdl3)" \
     44     NCURSES="-Wl,-Bstatic -lncursesw -ltinfo -Wl,-Bdynamic" >/dev/null
     45 strip catan
     46 cp catan /out/catan
     47 ldd /out/catan | sed "s/^/  /"'
     48 
     49 if [ "$HOST" = local ]; then
     50     DOCKER=docker
     51     if ! docker info >/dev/null 2>&1; then
     52         export SUDO_ASKPASS=${SUDO_ASKPASS:-$(command -v sudo-askpass || true)}
     53         if [ -z "$SUDO_ASKPASS" ]; then
     54             echo "docker necesita sudo y no hay sudo-askpass (o pone SUDO_ASKPASS, o RELEASE_HOST=...)" >&2
     55             exit 1
     56         fi
     57         DOCKER="sudo -A docker"
     58     fi
     59     T=$(mktemp -d)
     60     trap 'rm -rf "$T"' EXIT
     61     if ! $DOCKER image inspect $IMAGE >/dev/null 2>&1; then
     62         echo "armando la imagen $IMAGE (una sola vez: Ubuntu 22.04 + SDL3 estatico, ~10 min)..." >&2
     63         mkdir -p "$T/sdl"
     64         tar -C "$SDL_SRC" --exclude='./build*' -c . | tar -x -C "$T/sdl"
     65         printf '%s\n' "$DOCKERFILE" > "$T/sdl/Dockerfile"
     66         $DOCKER build -q -t $IMAGE "$T/sdl" >/dev/null
     67     fi
     68     mkdir -p "$(dirname "$OUT")" "$T/out"
     69     $DOCKER run --rm -v "$ROOT":/src:ro -v "$T/out":/out -e VERSION="$VERSION" $IMAGE sh -c "$BUILD"
     70     cp "$T/out/catan" "$OUT"
     71     exit 0
     72 fi
     73 
     74 # remoto: la imagen vive en ese host (se arma la primera vez, mandando la fuente de SDL3);
     75 # el codigo que se manda es lo que esta en git, tal como esta ahora
     76 R=/tmp/catan-release
     77 if ! ssh "$HOST" "docker image inspect $IMAGE >/dev/null 2>&1"; then
     78     echo "armando la imagen $IMAGE en $HOST (una sola vez, ~10 min)..." >&2
     79     ssh "$HOST" "rm -rf $R/sdl && mkdir -p $R/sdl"
     80     tar -C "$SDL_SRC" --exclude='./build*' -cz . | ssh "$HOST" "tar -xz -C $R/sdl"
     81     printf '%s\n' "$DOCKERFILE" | ssh "$HOST" "cat > $R/sdl/Dockerfile && docker build -q -t $IMAGE $R/sdl >/dev/null && rm -rf $R/sdl"
     82 fi
     83 ssh "$HOST" "rm -rf $R/src $R/out && mkdir -p $R/src $R/out"
     84 # (sin pipefail en sh: si tar falla por un archivo versionado borrado, lo acusa el build)
     85 (cd "$ROOT" && git ls-files -z | tar --null -T - -cz) | ssh "$HOST" "tar -xz -C $R/src"
     86 ssh "$HOST" "docker run --rm -v $R/src:/src:ro -v $R/out:/out -e VERSION='$VERSION' $IMAGE sh -c '$(printf '%s' "$BUILD" | sed "s/'/'\\\\''/g")'"
     87 mkdir -p "$(dirname "$OUT")"
     88 scp -q "$HOST:$R/out/catan" "$OUT"
     89 ssh "$HOST" "rm -rf $R/src $R/out"