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"