# Included by the top-level Makefile when ARCH=wasm.
#
# This configuration produces a modern Emscripten wasm build
# (tested with brew's emcc 5.0.6). Engine input/output routes
# through the CommandQueue pattern in glue.cpp — see that file
# for the design.

EXE = stockfish.js
COMP = em++
CXX = em++
comp = clang
arch = wasm
bits = 64

# Build options
wasm_simd = yes
minify_js = yes
assertion = no

VPATH := $(VPATH):emscripten

# glue.cpp lives under emscripten/ — pull it into the source list
# alongside the rest. wasm_simd.cpp is optional, gated below.
SRCS += emscripten/glue.cpp

EM_CXXFLAGS +=
EM_LDFLAGS += \
	--pre-js emscripten/initModule.js \
	-pthread \
	-s MODULARIZE=1 -s EXPORT_NAME="Stockfish" -s ENVIRONMENT=web,worker,node \
	-s PROXY_TO_PTHREAD=1 \
	-s ALLOW_BLOCKING_ON_MAIN_THREAD=0 \
	-s EXIT_RUNTIME=0 \
	-s ALLOW_MEMORY_GROWTH=1 -s INITIAL_MEMORY=$$((1 << 27)) -s MAXIMUM_MEMORY=$$((1 << 31)) \
	-s STACK_SIZE=16MB \
	-s EXPORTED_FUNCTIONS='[_malloc,_free,_main,_uci]' \
	-s EXPORTED_RUNTIME_METHODS='[stringToUTF8,UTF8ToString,HEAPU8,lengthBytesUTF8]' \
	-s INCOMING_MODULE_JS_API='[locateFile,print,printErr,wasmMemory,buffer,mainScriptUrlOrBlob]' \
	-s ALLOW_UNIMPLEMENTED_SYSCALLS \
	-s FILESYSTEM=0 \
	-Wno-pthreads-mem-growth

ifeq ($(minify_js),yes)
	EM_LDFLAGS += --closure 1
else
	EM_LDFLAGS += --closure 0 --minify 0
endif

ifeq ($(assertion),yes)
	EM_LDFLAGS += -s ASSERTIONS=1
else
	EM_LDFLAGS += -s ASSERTIONS=0
endif

ifeq ($(wasm_simd),yes)
	EM_CXXFLAGS += -DUSE_WASM_SIMD -msimd128
	SRCS += emscripten/wasm_simd.cpp
endif

# NNUE is always off for the wasm build — we don't ship a net file.
EM_CXXFLAGS += -DNNUE_EMBEDDING_OFF

EM_COMMIT = $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)

EXTRACXXFLAGS += \
	-DUSE_POPCNT -pthread $(EM_CXXFLAGS) \
	-DEM_COMMIT=$(EM_COMMIT)
EXTRALDFLAGS += $(EM_LDFLAGS)

EM_ARTIFACTS += stockfish.js stockfish.wasm

emscripten_clean: clean
	@rm -f $(EM_ARTIFACTS)
