WHY3D := ../why3d
BUILD := _build
TESTS := tests-cong

# Sources (starter filenames)
SRC_BARE := cong-bare.mlw
SRC_PATH := cong-path.mlw

# Extracted OCaml output unit names (match harness expectations)
EXTRACTED_BARE := $(BUILD)/congbare.ml
EXTRACTED_PATH := $(BUILD)/congpath.ml

# Harness
HARNESS := run_cong.ml
UF_HARNESS := run_uf.ml

# Binaries
BIN_BARE := $(BUILD)/run_cong_bare
BIN_PATH := $(BUILD)/run_cong_path
BIN_UF   := $(BUILD)/run_uf

.PHONY: all bare path test-bare test-path test-bare-% test-path-% test-uf-all test-uf-% clean extract build

all: $(BIN_BARE) $(BIN_PATH) $(BIN_UF)

$(BUILD):
	mkdir -p $(BUILD)

# Why3 extraction 
$(EXTRACTED_BARE): $(SRC_BARE) | $(BUILD)
	$(WHY3D) extract -D ocaml64 --recursive $< -o $@

$(EXTRACTED_PATH): $(SRC_PATH) | $(BUILD)
	$(WHY3D) extract -D ocaml64 --recursive $< -o $@

build: $(BIN_BARE) $(BIN_PATH) $(BIN_UF)

# Build harnesses
$(BIN_BARE): $(EXTRACTED_BARE) $(EXTRACTED_PATH) $(HARNESS)
	ocamlfind ocamlopt -package zarith,str,unix -linkpkg -I $(BUILD) $(EXTRACTED_BARE) $(EXTRACTED_PATH) $(HARNESS) -o $(BIN_BARE)

$(BIN_PATH): $(EXTRACTED_BARE) $(EXTRACTED_PATH) $(HARNESS)
	ocamlfind ocamlopt -package zarith,str,unix -linkpkg -I $(BUILD) $(EXTRACTED_BARE) $(EXTRACTED_PATH) $(HARNESS) -o $(BIN_PATH)

$(BIN_UF): $(EXTRACTED_BARE) $(UF_HARNESS)
	ocamlfind ocamlopt -package zarith,str,unix -linkpkg -I $(BUILD) $(EXTRACTED_BARE) $(UF_HARNESS) -o $(BIN_UF)

# Run all tests
test-bare: $(BIN_BARE)
	$(BIN_BARE) all

test-path: $(BIN_PATH)
	$(BIN_PATH) all

test-uf: $(BIN_UF)
	$(BIN_UF) all

clean:
	rm -rf $(BUILD)
	rm -f *.cmi *.cmx *.o
