OPT ?= 0

C_SRCS   := $(wildcard c_src/*.c)
RS_SRCS  := $(wildcard rs_src/*.rs)
C_WASMS  := $(patsubst c_src/%.c,   build/c/O$(OPT)/%.wasm, $(C_SRCS))
RS_WASMS := $(patsubst rs_src/%.rs, build/rs/O$(OPT)/%.wasm, $(RS_SRCS))

ANALYZER        := ../target/release/shadow-stack-analyzer
ANALYZER_SRCS   := $(shell find ../src -type f -name '*.rs') ../Cargo.toml ../Cargo.lock

.PHONY: all c rs test clean analyzer

all: c rs

c: $(C_WASMS)

rs: $(RS_WASMS)

build/c/O$(OPT)/%.wasm: c_src/%.c
	mkdir -p $(dir $@)
	emcc $< -o $@ --no-entry -O$(OPT) -s WASM=1
	wasm2wat $@ -o $(@:.wasm=.wat)
	wasm-objdump -d $@ > $(@:.wasm=.annotated.wat)

build/rs/O$(OPT)/%.wasm: rs_src/%.rs
	mkdir -p $(dir $@)
	rustc --edition=2024 --target wasm32-unknown-unknown --crate-type=cdylib \
	    -C opt-level=$(OPT) $< -o $@
	wasm2wat $@ -o $(@:.wasm=.wat)
	wasm-objdump -d $@ > $(@:.wasm=.annotated.wat)

analyzer: $(ANALYZER)

$(ANALYZER): $(ANALYZER_SRCS)
	cargo build --release --manifest-path ../Cargo.toml

test: all $(ANALYZER)
	./test-all.sh

clean:
	rm -rf build results
