# Compila el núcleo de Stella + la capa web (src/) a WebAssembly con Emscripten.
#
#   make            -> ../emu/stella-abadia.js + .wasm y, siempre a la vez,
#                      ../emu/stella-abadia-fuentes.tar.gz (código fuente completo, GPL)
#   make binario    -> solo el binario (para probar; NO publicar sin `make`)
#   make limpiar
#
# La GPL obliga a publicar el binario con su código fuente correspondiente. Por eso
# `make` genera los dos juntos, y el tarball guarda en capa-web/BINARIO.sha256 la
# huella del .js y el .wasm: scripts/build.sh no publica si no coinciden.
#
# Hace falta el árbol de Stella 7.0 y em++. STELLA se busca en ../stella-7.0 (al
# compilar desde el tarball de fuentes) y si no, en ~/src/stella.
# No se modifica nada de Stella: la lista de fuentes es la del port libretro
# (src/os/libretro/Makefile.common) menos su interfaz, más el FSNode POSIX del port
# Unix y nuestras cabeceras de src/, que se buscan antes que las de os/libretro.

STELLA ?= $(if $(wildcard ../stella-7.0/src),$(abspath ../stella-7.0),$(HOME)/src/stella)
SRC     = $(STELLA)/src
OUT    ?= ../emu
# El JavaScript de la página: en la web, ../js; dentro del tarball, junto al Makefile.
JSDIR  ?= $(if $(wildcard ../js/emulador.js),../js,.)
SHA256  = $(shell command -v sha256sum >/dev/null 2>&1 && echo sha256sum || echo 'shasum -a 256')
OBJ     = build
NOMBRE  = stella-abadia
EMXX   ?= em++

LISTA := $(shell sed -n '/^SOURCES_CXX/,/^$$/p' $(SRC)/os/libretro/Makefile.common \
           | grep 'CORE_DIR./' | sed 's/.*CORE_DIR.\///; s/ *\\$$//')
EXCLUIR := os/libretro/libretro.cxx os/libretro/FSNodeLIBRETRO.cxx os/libretro/StellaLIBRETRO.cxx \
           common/StaggeredLogger.cxx common/TimerManager.cxx
FUENTES := $(filter-out $(EXCLUIR),$(LISTA)) os/unix/FSNodePOSIX.cxx

PROPIAS := web.cxx StaggeredLogger.cxx TimerManager.cxx
OBJS := $(patsubst %.cxx,$(OBJ)/stella/%.o,$(FUENTES)) $(patsubst %.cxx,$(OBJ)/%.o,$(PROPIAS))
DEPS := $(OBJS:.o=.d)

INCLUDES = -Isrc -I$(SRC) -I$(SRC)/os/libretro -I$(SRC)/os/unix -I$(SRC)/emucore \
  -I$(SRC)/emucore/elf -I$(SRC)/emucore/tia -I$(SRC)/emucore/tia/frame-manager \
  -I$(SRC)/common -I$(SRC)/common/audio -I$(SRC)/common/tv_filters -I$(SRC)/common/repository \
  -I$(SRC)/lib/json -I$(SRC)/lib/httplib -I$(SRC)/lib/sqlite

OPT      ?= -O3
CXXFLAGS  = -std=c++20 $(OPT) -fno-rtti -fwasm-exceptions -D__LIB_RETRO__ -DSOUND_SUPPORT \
            -Wno-deprecated-literal-operator $(INCLUDES) -MMD -MP \
            -ffile-prefix-map=$(SRC)=stella-7.0/src -ffile-prefix-map=$(CURDIR)=capa-web

LDFLAGS = $(OPT) -fwasm-exceptions \
  -sMODULARIZE=1 -sEXPORT_NAME=crearStellaAbadia -sENVIRONMENT=web,node \
  -sALLOW_MEMORY_GROWTH=1 -sINITIAL_MEMORY=67108864 -sSTACK_SIZE=2097152 \
  -sFORCE_FILESYSTEM=1 -lidbfs.js \
  -sEXPORTED_RUNTIME_METHODS=cwrap,ccall,FS,IDBFS,HEAPU8,HEAP16,HEAPU32,UTF8ToString,stringToUTF8,lengthBytesUTF8 \
  -sEXPORTED_FUNCTIONS=_malloc,_free

.PHONY: todo binario fuentes limpiar lista FORCE
todo: fuentes
binario: $(OUT)/$(NOMBRE).js

$(OUT)/$(NOMBRE).js: $(OBJS)
	@mkdir -p $(OUT)
	$(EMXX) $(LDFLAGS) -o $@ $^
	@ls -la $(OUT)/$(NOMBRE).js $(OUT)/$(NOMBRE).wasm

$(OBJ)/opciones: FORCE
	@mkdir -p $(OBJ)
	@echo '$(CXXFLAGS) | $(LDFLAGS)' | cmp -s - $@ || echo '$(CXXFLAGS) | $(LDFLAGS)' > $@

$(OBJ)/stella/%.o: $(SRC)/%.cxx $(OBJ)/opciones
	@mkdir -p $(dir $@)
	$(EMXX) $(CXXFLAGS) -c $< -o $@

$(OBJ)/%.o: src/%.cxx $(OBJ)/opciones
	@mkdir -p $(dir $@)
	$(EMXX) $(CXXFLAGS) -c $< -o $@

# Código fuente completo correspondiente al binario (obligación de la GPL): los .cxx
# compilados, todas las cabeceras de Stella que usan (según los .d del compilador),
# licencias y textos de Stella, y nuestra capa web con este Makefile.
fuentes: $(OUT)/$(NOMBRE).js
	@rm -rf $(OBJ)/fuentes && mkdir -p $(OBJ)/fuentes/stella-7.0/src $(OBJ)/fuentes/capa-web
	@( cd $(SRC) && echo os/libretro/Makefile.common; for f in $(FUENTES); do echo $$f; done; \
	   cat $(CURDIR)/$(OBJ)/stella/*/*.d $(CURDIR)/$(OBJ)/stella/*/*/*.d $(CURDIR)/$(OBJ)/stella/*/*/*/*.d 2>/dev/null \
	     | tr ' \\' '\n\n' | grep '^$(SRC)/' | sed 's|^$(SRC)/||; s|:$$||' ) | sort -u \
	 | ( cd $(SRC) && tar cf - -T - ) | ( cd $(OBJ)/fuentes/stella-7.0/src && tar xf - )
	@cp $(STELLA)/License.txt $(STELLA)/Copyright.txt $(STELLA)/README.md $(OBJ)/fuentes/stella-7.0/
	@cp -R src Makefile README.md LICENSE COPYRIGHT LEEME-FUENTES.txt $(OBJ)/fuentes/capa-web/
	@cp $(JSDIR)/emulador.js $(JSDIR)/emulador-audio.js $(OBJ)/fuentes/capa-web/
	@cp LEEME-FUENTES.txt $(OBJ)/fuentes/LEEME.txt
	@( cd $(OUT) && $(SHA256) $(NOMBRE).js $(NOMBRE).wasm ) > $(OBJ)/fuentes/capa-web/BINARIO.sha256
	@( cd $(OBJ)/fuentes && tar czf $(CURDIR)/$(OUT)/$(NOMBRE)-fuentes.tar.gz LEEME.txt stella-7.0 capa-web )
	@ls -la $(OUT)/$(NOMBRE)-fuentes.tar.gz

lista:
	@echo $(FUENTES) | tr ' ' '\n'

limpiar:
	rm -rf $(OBJ) $(OUT)/$(NOMBRE).js $(OUT)/$(NOMBRE).wasm $(OUT)/$(NOMBRE)-fuentes.tar.gz

FORCE:

-include $(DEPS)
