exl100

Émulateur Exelvision EXL 100 (1984) dans le navigateur : dsp-cpp en WebAssembly, cartouches et cassettes BASIC
git clone https://git.schurger.org/exl100.git
Log | Files | Refs | README

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