include ../common.mk

WASI_SDK_VERSION=24
WASMTIME_VERSION=46.0.1

CONFIG_SITE=$(PYTHONBUILD)/Tools/wasm/wasi/config.site-wasm32-wasi
CROSSBUILD=$(PYTHONBUILD)/cross-build/wasm32-wasip1
LIBDIR=$(CROSSBUILD)/build/lib.wasi-wasm32-$(PYMAJORMINOR)

# In CI the WASI SDK is installed by bytecodealliance/setup-wasi-sdk-action, which sets
# WASI_SDK_PATH; otherwise download the release asset matching this host into the build dir.
ifdef GITHUB_ACTIONS
WASI_SDK_DIR=$(WASI_SDK_PATH)
WASI_SDK_DEP=
else
WASI_SDK_DIR=$(BUILDROOT)/wasi-sdk
WASI_SDK_DEP=$(WASI_SDK_DIR)/.exists
WASI_SDK_OS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | sed 's/darwin/macos/')
WASI_SDK_ARCH := $(shell uname -m | sed 's/aarch64/arm64/')
WASI_SDK_URL=https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-$(WASI_SDK_VERSION)/wasi-sdk-$(WASI_SDK_VERSION).0-$(WASI_SDK_ARCH)-$(WASI_SDK_OS).tar.gz
endif

# Similar for wasmtime, which is otherwise expected on PATH.
ifdef GITHUB_ACTIONS
WASMTIME_DEP=
WASMTIME_PATH=
else
WASMTIME_DIR=$(BUILDROOT)/wasmtime
WASMTIME_DEP=$(WASMTIME_DIR)/.exists
WASMTIME_PATH=$(WASMTIME_DIR):
WASMTIME_OS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | sed 's/darwin/macos/')
# NB wasmtime names artifacts with aarch64 architecture, unlike wasi which uses arm64
WASMTIME_ARCH := $(shell uname -m | sed 's/arm64/aarch64/')
WASMTIME_URL=https://github.com/bytecodealliance/wasmtime/releases/download/v$(WASMTIME_VERSION)/wasmtime-v$(WASMTIME_VERSION)-$(WASMTIME_ARCH)-$(WASMTIME_OS).tar.xz
endif

all: $(LIBDIR)/libpython$(PYMAJORMINOR).a

$(WASI_SDK_DIR)/.exists: $(BUILDROOT)/.exists
	[ -d $(WASI_SDK_DIR) ] || mkdir -p $(WASI_SDK_DIR)
	curl -s -S --location $(WASI_SDK_URL) | \
		tar --strip-components 1 --directory $(WASI_SDK_DIR) --extract --gunzip
	touch $@

$(WASMTIME_DIR)/.exists: $(BUILDROOT)/.exists
	[ -d $(WASMTIME_DIR) ] || mkdir -p $(WASMTIME_DIR)
	curl -s -S --location $(WASMTIME_URL) | \
		tar --strip-components 1 --directory $(WASMTIME_DIR) --extract --xz
	touch $@

$(PYTHONBUILD)/.patched: $(PYTHONBUILD)/.exists
	# Force-disable POSIX dynamic loading for WASI
	grep -q '^ac_cv_func_dlopen=no' $(CONFIG_SITE) || \
		printf '\nac_cv_func_dlopen=no\nac_cv_lib_dl_dlopen=no\n' >> $(CONFIG_SITE)
	touch $@

$(LIBDIR)/libpython$(PYMAJORMINOR).a: $(PYTHONBUILD)/.patched $(WASI_SDK_DEP) $(WASMTIME_DEP)
	cd $(PYTHONBUILD) && \
		WASI_SDK_PATH=$(WASI_SDK_DIR) \
		PATH=$(WASMTIME_PATH)$(PATH) \
		$(PYTHON) Tools/wasm/wasi build -- --config-cache
	# Collect the static libraries the test build links against
	cp $(CROSSBUILD)/libpython$(PYMAJORMINOR).a \
	   $(CROSSBUILD)/Modules/_hacl/libHacl_HMAC.a \
	   $(CROSSBUILD)/Modules/_decimal/libmpdec/libmpdec.a \
	   $(CROSSBUILD)/Modules/expat/libexpat.a \
	   $(LIBDIR)
