Makefile (4888B)
1 # exl100 : Exelvision EXL 100 (1984) dans le navigateur, servi sur https://exl100.schurger.org 2 # L'émulateur dsp-cpp de Chusogar (C++17 + SDL2, driver « exelv » d'après MAME) est compilé en 3 # WebAssembly par Emscripten, avec la ROM système embarquée ; le reste est du statique. 4 HOST = apostrophe 5 WWW = /var/www/exl100.schurger.org 6 VHOST = exl100.schurger.org 7 8 # dsp-cpp est cloné ici à la compilation (pas de licence amont : on ne le versionne pas), épinglé 9 # à un commit connu. roms/exl100.zip est la ROM MAME (CRC 049109a3 + 38f6fc7a). roms/exeltel.zip 10 # est la ROM de l'EXELTEL (terminal télématique 64 Ko de la même famille, même driver exelv) : la 11 # page le propose comme seconde machine (sélecteur « Machine »), lancé via ?game=exeltel. Les deux 12 # ROMs sont embarquées dans dsp.data (DSP_WEB_ROMS_DIR). 13 UPSTREAM_URL = https://github.com/Chusogar/dsp-cpp.git 14 UPSTREAM_REV = fa4d1abbdcee2d55b51c7f4f4a469a16f41de5bf 15 16 # Emscripten par l'image Docker officielle ; cache des ports (SDL2, zlib) dans .emcache/. 17 EMSDK_IMAGE = emscripten/emsdk:6.0.13 18 DOCKER = docker run --rm -u $(shell id -u):$(shell id -g) -e HOME=/tmp -e EM_CACHE=/work/.emcache \ 19 -v $(CURDIR):/work -w /work $(EMSDK_IMAGE) 20 21 # On ne bâtit que le driver « exelv », ROM empaquetée dans dsp.data, démarrage automatique de l'exl100. 22 CMFLAGS = -DCMAKE_BUILD_TYPE=Release -DDSP_DRIVERS=exelv -DDSP_PER_DRIVER_TARGETS=OFF \ 23 -DDSP_WEB_ROMS_DIR=/work/roms "-DDSP_WEB_ARGS=--game exl100 /roms/exl100.zip" 24 25 .PHONY: all upstream cartridges build test serve deploy install-vhost clean distclean 26 27 all: build 28 29 # Convertisseur .wav -> .k7 (décodeur de cassette de dsp compilé en wasm/Node) : rend compactes les 30 # cassettes webmo qui n'existent qu'en gros enregistrements .wav. 31 tools/wav2k7.js: tools/wav2k7.cpp upstream/src/drivers/computers/exelv_tape.cpp 32 $(DOCKER) em++ -O2 -std=c++17 -I /work/upstream/src /work/tools/wav2k7.cpp \ 33 /work/upstream/src/drivers/computers/exelv_tape.cpp \ 34 -sNODERAWFS=1 -sENVIRONMENT=node -sALLOW_MEMORY_GROWTH=1 -o /work/tools/wav2k7.js 35 36 # Cartouches et cassettes EXL 100 (pack TOSEC sur archive.org + extras webmo.fr) dans roms/ ; 37 # non versionnées. La page les embarque dans dsp.data et les propose au menu. 38 cartridges: roms/cartridges/titles.json 39 roms/cartridges/titles.json: tools/get_cartridges.py upstream 40 python3 -I tools/get_cartridges.py 41 python3 -I tools/get_dcexel.py 42 python3 -I tools/get_cram.py 43 44 # Clone d'amont épinglé (idempotent) 45 upstream: 46 @test -d upstream/.git || git clone -q $(UPSTREAM_URL) upstream 47 @git -C upstream fetch -q --depth 1 origin $(UPSTREAM_REV) && git -C upstream checkout -q $(UPSTREAM_REV) 48 49 # Construction web : dsp.html/js/wasm/data, puis recopiés dans web/ (index.html = dsp.html). 50 build: upstream cartridges web/index.html 51 52 web/index.html: $(wildcard roms/*) roms/cartridges/titles.json web/shell.html.in Makefile 53 cp web/shell.html.in upstream/web/shell.html.in 54 # Correctifs source appliqués au clone amont (patches/exl100.patch) : portabilité Emscripten de 55 # mpeg_audio.cpp (abort sans <cstdlib>), son de la parole TMS5220 (double avance ~4,8x trop vite), 56 # et couleurs du TMS3556 (fond de zone par délimiteurs, d'après MAME : corrige le noir sur noir 57 # des menus comme Exeldrums et les attributs couleur). Voir patches/exl100.patch. 58 grep -q 'zone_bg' upstream/src/video/tms3556.cpp || git -C upstream apply $(CURDIR)/patches/exl100.patch 59 $(DOCKER) emcmake cmake -S /work/upstream -B /work/build-web $(CMFLAGS) 60 $(DOCKER) cmake --build /work/build-web -j --target dsp 61 mkdir -p web 62 cp build-web/dsp.js build-web/dsp.wasm build-web/dsp.data web/ 63 cp build-web/dsp.html web/index.html 64 @echo "web/ prêt" 65 66 # Démarrage dans un Chromium headless : capture d'écran et présence du canevas 67 test: build 68 node test/syntax.mjs web/index.html 69 python3 -m http.server 8191 -d web --bind 127.0.0.1 >/dev/null 2>&1 & echo $$! > .serve.pid; \ 70 sleep 1; node test/browser.mjs http://127.0.0.1:8191/ 14 /tmp/exl100.png; r=$$?; kill `cat .serve.pid`; rm -f .serve.pid; exit $$r 71 72 # Essai local : http://localhost:8191/ 73 serve: 74 python3 -m http.server 8191 -d web 75 76 # Publication : fichiers statiques copiés sur apostrophe 77 deploy: build 78 ssh $(HOST) 'sudo install -d -o jeansch -g jeansch $(WWW)' 79 rsync -rc --delete --exclude '.*' web/ $(HOST):$(WWW)/ 80 @echo "https://$(VHOST)/" 81 82 # Vhost nginx (une fois) : 8443 derrière sslh, certificat joker, comme les autres sites d'apostrophe 83 install-vhost: 84 scp deploy/$(VHOST) $(HOST):/tmp/$(VHOST) 85 ssh $(HOST) 'sudo install -m 644 /tmp/$(VHOST) /etc/nginx/sites-available/$(VHOST) && sudo ln -sf /etc/nginx/sites-available/$(VHOST) /etc/nginx/sites-enabled/$(VHOST) && sudo nginx -t && sudo systemctl reload nginx && rm /tmp/$(VHOST)' 86 87 clean: 88 rm -rf build-web web/dsp.js web/dsp.wasm web/dsp.data web/index.html 89 90 distclean: clean 91 rm -rf upstream .emcache