
CXX ?= clang++

BUILDDIR ?= build
CACHEDIR ?= cache

CGAL ?= CGAL-6.1
CGAL_URL ?= https://github.com/CGAL/cgal/releases/download/v6.1/CGAL-6.1-library.tar.xz

BOOST ?= boost_1_90_0
BOOST_URL ?= https://archives.boost.io/release/1.90.0/source/boost_1_90_0.tar.gz

WASI_SDK_URL ?= https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-29/wasi-sdk-29.0-x86_64-linux.tar.gz
WASI_SDK ?= $(CACHEDIR)/wasi-sdk-29.0-x86_64-linux

SOURCES := \
	skeleton_wrapper.cpp

WASI_SOURCES := \
	$(SOURCES) \
	exception_stubs.cpp \

INCLUDES := -I$(CACHEDIR)/$(CGAL)/include -I$(CACHEDIR)/$(BOOST)
CXXFLAGS := -std=c++20 -g -Wall -Wextra -O2 -DCGAL_ALWAYS_ROUND_TO_NEAREST
WASI_CXXFLAGS := -DCGAL_ALWAYS_ROUND_TO_NEAREST -DCGAL_CORE_USE_BOOST_BACKEND -DCGAL_DISABLE_GMP -DCGAL_USE_BOOST_MP -DFE_UPWARD=FE_TONEAREST -D_WASI_EMULATED_PROCESS_CLOCKS $(CXXFLAGS)
LDFLAGS :=
HOST_LDFLAGS := $(LDFLAGS) -lgmp -lmpfr
WASI_LDFLAGS := $(LDFLAGS) -lwasi-emulated-process-clocks 

WASI_CXX ?= $(WASI_SDK)/bin/clang++


BINARY := skeleton

all: $(BUILDDIR)/$(BINARY) wasm

.PHONY: wasm
wasm: $(BUILDDIR)/$(BINARY).wasm

$(BUILDDIR)/$(BINARY): $(SOURCES)
	$(CXX) $(CXXFLAGS) $(HOST_LDFLAGS) -o $@ $^

$(WASI_SDK):
	mkdir -p $(dir $@)
	cd $(dir $@); curl -L ${WASI_SDK_URL} | tar xzf -

$(CACHEDIR)/$(BOOST):
	cd $(dir $@); curl -L ${BOOST_URL} | tar xzf -

$(CACHEDIR)/$(CGAL):
	cd $(dir $@); curl -L ${CGAL_URL} | tar xJf -

$(BUILDDIR)/wasi/%.o: %.cpp $(WASI_SDK) 
	@mkdir -p $(dir $@) 
	$(WASI_CXX) -c $(WASI_CXXFLAGS) $(INCLUDES) -o $@ $<

$(BUILDDIR)/$(BINARY).wasm: $(patsubst %.cpp,$(BUILDDIR)/wasi/%.o,$(WASI_SOURCES))
	@mkdir -p $(dir $@)
	$(WASI_CXX) $(WASI_LDFLAGS) -o $@ $^

.PHONY: clean
clean:
	rm -rf $(BUILDDIR)

.PHONY: mrproper
mrproper: clean
	rm -rf $(CACHEDIR)
