#!/usr/bin/env bash # Compila o Zetawar (estrategia por turnos de Zetawar/Arugaba LLC, MIT; ClojureScript + Reagent + DataScript) a partir do commit # dc1ee8d de github.com/Zetawar/zetawar. O projeto usa Boot + Perun (gera o site com blog, analytics e Sentry); aqui nao se usa o # Boot: o app e compilado direto pela API do ClojureScript 1.9.293 (as mesmas versoes do :dependencies do build.boot, resolvidas # pelo tools.deps 1.12.6 com zetawar/deps.edn; cada .jar conferido por zetawar/jars.sha256), em JDK 8 (Temurin 8u504, x86_64 via # Rosetta: o DataScript 0.15.5 nao compila em JDK >= 11), modo :advanced. O CSS vem do main.scss do projeto com o Bootstrap Sass # 3.3.7 e o Font Awesome 4.7.0 dos webjars, compilados pelo dart-sass 1.107.1 (sem o autoprefixer do projeto). # # Mudancas (zetawar/zetawar-web.patch): sem o Raven/Sentry, sem o menu e o rodape do site (blog, docs, GitHub, Twitter, feedback), # textos sem links externos. Nao vao: a musica (assets/audio/, CC BY-NC 4.0), o logo do patrocinador AwesomeForms # (assets/images/sponsors/), o site, o blog e as paginas do Perun. A pagina (zetawar/index.html + start.js) e nossa. # Os prefixos de URL do jogo viram "." (ZETAWAR_PREFIX): as imagens saem relativas a pagina. # # src/FredGames.Bundler/Builds/build-zetawar.sh # # Saida: artifacts/build/zetawar-dc1ee8d/{zetawar-dc1ee8d-dist.tar.gz,licenses.txt}; o tar.gz tem que sair igual em dois builds. set -euo pipefail COMMIT=dc1ee8d27afcac1cd98904859289012c2806e58c SHA256=b36c7269b38e09045150c536b67d2ae4584f4fed219ed732cfbe04cd9f1fe9c8 CT_VERSION=1.12.6.1673 CT_SHA256=bb2f8a9f3fa94834813bd437b2a28b857c2f4b7267cb80168c0c6b910f883d4f JDK8_VERSION=jdk8u504-b01 JDK8_SHA256=4b4518a2060c98c0ed195947fa29c8f5aa7f1c608817e8ad1850719517f11ac0 SASS_VERSION=1.107.1 SASS_SHA256=44420308bc712df857ab99ab16f0a3b2eec0f8bb44692f9eb4688e51ba53ef35 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/zetawar-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tools="$root/artifacts/tools" m2="$cache/m2-zetawar" mkdir -p "$cache" "$tools" fetch() { # url arquivo sha256 if [ ! -f "$cache/$2" ]; then curl -fsSL --retry 4 "$1" -o "$cache/$2.partial" && mv "$cache/$2.partial" "$cache/$2" fi echo "$3 $cache/$2" | shasum -a 256 -c - > /dev/null } fetch "https://github.com/Zetawar/zetawar/archive/$COMMIT.tar.gz" "zetawar-${COMMIT:0:7}.tar.gz" "$SHA256" fetch "https://github.com/clojure/brew-install/releases/download/$CT_VERSION/clojure-tools.zip" "clojure-tools-$CT_VERSION.zip" "$CT_SHA256" fetch "https://github.com/adoptium/temurin8-binaries/releases/download/$JDK8_VERSION/OpenJDK8U-jdk_x64_mac_hotspot_8u504b01.tar.gz" "OpenJDK8U-jdk_x64_mac_hotspot_8u504b01.tar.gz" "$JDK8_SHA256" fetch "https://github.com/sass/dart-sass/releases/download/$SASS_VERSION/dart-sass-$SASS_VERSION-macos-arm64.tar.gz" "dart-sass-$SASS_VERSION-macos-arm64.tar.gz" "$SASS_SHA256" # ferramentas em artifacts/tools (nunca no sistema) if [ ! -d "$tools/clojure-tools-$CT_VERSION/ClojureTools" ]; then mkdir -p "$tools/clojure-tools-$CT_VERSION"; unzip -oq "$cache/clojure-tools-$CT_VERSION.zip" -d "$tools/clojure-tools-$CT_VERSION" fi if [ ! -d "$tools/jdk8u504-b01/$JDK8_VERSION" ]; then mkdir -p "$tools/jdk8u504-b01"; tar xzf "$cache/OpenJDK8U-jdk_x64_mac_hotspot_8u504b01.tar.gz" -C "$tools/jdk8u504-b01" fi if [ ! -d "$tools/dart-sass-$SASS_VERSION/dart-sass" ]; then mkdir -p "$tools/dart-sass-$SASS_VERSION"; tar xzf "$cache/dart-sass-$SASS_VERSION-macos-arm64.tar.gz" -C "$tools/dart-sass-$SASS_VERSION" fi J21="$tools/jdk-jdk-21.0.13+9/Contents/Home/bin/java" J8="$tools/jdk8u504-b01/$JDK8_VERSION/Contents/Home/bin/java" CT="$tools/clojure-tools-$CT_VERSION/ClojureTools/clojure-tools-$CT_VERSION.jar" SASS="$tools/dart-sass-$SASS_VERSION/dart-sass/sass" rm -rf "$out"; mkdir -p "$out/tree" "$out/dist/css" "$out/dist/js" "$out/dist/fonts" "$out/dist/images" "$out/work" tar -xzf "$cache/zetawar-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 tree="$out/tree" patch -d "$tree" -p1 -s < "$here/zetawar/zetawar-web.patch" # 1. classpath: tools.deps resolve zetawar/deps.edn no repositorio local $m2; cada .jar confere com jars.sha256 sed "s#@M2@#$m2#" "$here/zetawar/deps.edn" > "$out/work/deps.edn" ( cd "$out/work" && "$J21" -cp "$CT" clojure.main -e " (require '[clojure.tools.deps :as d]) (let [b (d/create-basis {:project \"deps.edn\" :user nil :extra nil}) jars (filter #(.endsWith ^String % \".jar\") (:classpath-roots b))] (spit \"cp.txt\" (clojure.string/join \":\" jars)) (spit \"jars.txt\" (clojure.string/join \"\n\" (sort jars))))" > "$out/work/deps.log" 2>&1 || { cat "$out/work/deps.log"; exit 1; } ) ( cd "$m2" && sed "s#^\([0-9a-f]*\) #\1 #" "$here/zetawar/jars.sha256" | shasum -a 256 -c - > "$out/work/jars-check.log" 2>&1 ) || { cat "$out/work/jars-check.log"; exit 1; } [ "$(grep -c . "$out/work/jars.txt")" = "$(grep -c . "$here/zetawar/jars.sha256")" ] || { echo "a lista de jars mudou"; exit 1; } # 2. ClojureScript (so as fontes do app: sem devcards, workspaces nem dev) mkdir -p "$tree/build-src" for d in clj cljc cljs js; do cp -R "$tree/src/$d" "$tree/build-src/$d"; done rm -rf "$tree/build-src/cljs/zetawar/workspaces" "$tree/build-src/cljs/zetawar/devcards" "$tree/build-src/cljs/zetawar/devcards.cljs" "$tree/build-src/cljs/zetawar/dev.cljs" ( cd "$tree" ZETAWAR_PREFIX="." arch -x86_64 "$J8" -Duser.timezone=UTC -Dfile.encoding=UTF-8 -cp "build-src/clj:build-src/cljc:build-src/cljs:build-src/js:$(cat "$out/work/cp.txt")" \ clojure.main "$here/zetawar/build.clj" > "$out/cljs.log" 2>&1 || { tail -30 "$out/cljs.log"; exit 1; } ) cp "$tree/out/js/main.js" "$out/dist/js/main.js" cp "$here/zetawar/start.js" "$out/dist/js/start.js" cp "$here/zetawar/index.html" "$out/dist/index.html" # 3. CSS: Bootstrap Sass + Font Awesome dos webjars + src/scss/main.scss do projeto sassroot="$out/work/sass"; mkdir -p "$sassroot/bootstrap" "$sassroot/font-awesome" "$out/work/jars" unzip -oq "$m2/org/webjars/bootstrap-sass/3.3.7/bootstrap-sass-3.3.7.jar" -d "$out/work/jars/bs" unzip -oq "$m2/org/webjars/font-awesome/4.7.0/font-awesome-4.7.0.jar" -d "$out/work/jars/fa" cp -R "$out/work/jars/bs/META-INF/resources/webjars/bootstrap-sass/3.3.7/stylesheets/." "$sassroot/bootstrap/" cp "$out/work/jars/fa/META-INF/resources/webjars/font-awesome/4.7.0/scss/"_*.scss "$sassroot/font-awesome/" cp "$out/work/jars/fa/META-INF/resources/webjars/font-awesome/4.7.0/scss/font-awesome.scss" "$sassroot/font-awesome/_font-awesome.scss" cp "$tree/src/scss/main.scss" "$sassroot/main.scss" "$SASS" --quiet --no-source-map --style=compressed --no-charset --precision=8 "$sassroot/main.scss" "$out/dist/css/main.css" cp "$out/work/jars/fa/META-INF/resources/webjars/font-awesome/4.7.0/fonts/"fontawesome-webfont.* "$out/work/jars/fa/META-INF/resources/webjars/font-awesome/4.7.0/fonts/"FontAwesome.otf "$out/dist/fonts/" # 4. imagens do jogo (sem sponsors/, sem audio/) cp -R "$tree/assets/images/game" "$out/dist/images/game" cp "$tree/assets/images/navbar-logo.svg" "$tree/assets/images/spin-64.gif" "$out/dist/images/" # 5. licencas { echo "== Zetawar (LICENSE.txt do repositorio, MIT)" cat "$tree/LICENSE.txt" echo cat "$here/zetawar/third-party-licenses.txt" sec() { echo; echo "========================================================================"; echo "$1"; echo "========================================================================"; cat "$here/zetawar/lic/$2"; } sec "Bootstrap Sass 3.3.7 (stylesheets): MIT (LICENSE of twbs/bootstrap-sass v3.3.7)" bootstrap-sass-LICENSE sec "Font Awesome 4.7.0 (fonts and SCSS)" fontawesome-NOTICE sec "React 15.4.2, ReactDOM and ReactDOMServer (cljsjs 15.4.2-2): BSD License (LICENSE of facebook/react v15.4.2)" react-LICENSE sec "React 15.4.2: Additional Grant of Patent Rights (PATENTS of facebook/react v15.4.2)" react-PATENTS sec "React-Bootstrap 0.30.6 (cljsjs 0.30.6-0): MIT (LICENSE of react-bootstrap v0.30.6)" react-bootstrap-LICENSE sec "Reagent 0.6.1: MIT (LICENSE of reagent-project/reagent, default branch)" reagent-LICENSE sec "clipboard.js 1.5.9 (cljsjs 1.5.9-0): MIT (LICENSE of zenorocha/clipboard.js, default branch)" clipboard-LICENSE sec "Integrant 0.2.1: MIT (LICENSE of weavejester/integrant, default branch)" integrant-LICENSE sec "ClojureScript 1.9.293, core.async 0.2.395, DataScript 0.15.5, Posh 0.5.5, Tongue 0.2.0: Eclipse Public License 1.0 (LICENSE of datascript 0.15.5; the source of each library is in the sources list of this page)" epl-LICENSE sec "Google Closure Library, transit-cljs 0.8.239 and transit-js 0.8.846: Apache License 2.0 (LICENSE of the Closure Library jar)" apache-2.0-LICENSE } > "$out/licenses.txt" for f in "$out/work/jars/fa/META-INF/resources/webjars/font-awesome/4.7.0/"LICENSE*; do [ -f "$f" ] && { echo; echo "--- $(basename "$f")"; cat "$f"; } >> "$out/licenses.txt"; done find "$out/dist" -exec touch -t 202611080000 {} + ( cd "$out" && find dist -type f | LC_ALL=C sort > files.txt \ && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n -cf - -T files.txt \ | gzip -n -9 > "zetawar-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) ls -l "$out/zetawar-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/zetawar-${COMMIT:0:7}-dist.tar.gz" "$out/licenses.txt" rm -rf "$tree"