# Zupt v1.5.0 — Makefile with Jasmin integration
CC       ?= gcc
CFLAGS   ?= -Wall -Wextra -O2 -std=c11
CFLAGS   += -Iinclude -Isrc
LDLIBS   = -lm -lpthread
PREFIX   ?= /usr/local
BINDIR   ?= $(PREFIX)/bin

SOURCES  = src/zupt_main.c src/zupt_format.c src/zupt_lz.c src/zupt_lzh.c \
           src/zupt_xxh.c src/zupt_sha256.c src/zupt_aes256.c src/zupt_crypto.c \
           src/zupt_predict.c src/zupt_parallel.c src/zupt_keccak.c \
           src/zupt_x25519.c src/zupt_mlkem.c src/zupt_cpuid.c

HEADERS  = include/zupt.h include/zupt_keccak.h include/zupt_mlkem.h \
           include/zupt_x25519.h include/zupt_cpuid.h include/zupt_jasmin.h \
           src/zupt_thread.h src/zupt_parallel.h

TARGET   = zupt

# Jasmin: use pre-compiled .s files if present (mac_verify + mlkem_select)
JAZZ_S = jasmin/zupt_mac_verify.s jasmin/zupt_mlkem_select.s
JAZZ_AVAILABLE := $(wildcard $(JAZZ_S))

ifeq ($(JAZZ_AVAILABLE),$(JAZZ_S))
  CFLAGS += -DZUPT_USE_JASMIN
  JAZZ_O = jasmin/zupt_mac_verify.o jasmin/zupt_mlkem_select.o
  $(info [jasmin] Verified assembly found — linking CT crypto)
else
  JAZZ_O =
  $(info [jasmin] Assembly not found — using C fallback)
endif

.PHONY: all clean install uninstall test test-all test-asan test-vectors help

all: $(TARGET)

jasmin/%.o: jasmin/%.s
	$(CC) -c -o $@ $<

$(TARGET): $(SOURCES) $(HEADERS) $(JAZZ_O)
	$(CC) $(CFLAGS) $(SOURCES) $(JAZZ_O) $(LDLIBS) -o $(TARGET)
	@echo "Build complete: ./$(TARGET)"

clean:
	rm -f $(TARGET) zupt_asan test_vectors jasmin/*.o

install: $(TARGET)
	@mkdir -p $(DESTDIR)$(BINDIR)
	install -m 755 $(TARGET) $(DESTDIR)$(BINDIR)/$(TARGET)
	@echo "Installed: $(DESTDIR)$(BINDIR)/$(TARGET)"

uninstall:
	rm -f $(DESTDIR)$(BINDIR)/$(TARGET)

test: $(TARGET)
	@sh tests/run_quick.sh

test-all: $(TARGET) test-vectors
	@echo "═══════════════════════════════════════════════"
	@sh tests/regression.sh 2>&1 | tail -3
	@echo ""
	@sh tests/test_threaded.sh 2>&1 | tail -3
	@echo ""
	@sh tests/test_pq.sh ./zupt 2>&1 | tail -3
	@echo ""
	@./test_vectors 2>&1 | tail -2
	@echo "═══════════════════════════════════════════════"

test-vectors: tests/test_vectors.c $(SOURCES) $(HEADERS)
	$(CC) -O2 -std=c11 -Iinclude -Isrc tests/test_vectors.c \
	    src/zupt_sha256.c src/zupt_crypto.c src/zupt_aes256.c src/zupt_xxh.c \
	    src/zupt_keccak.c src/zupt_x25519.c src/zupt_mlkem.c src/zupt_cpuid.c \
	    $(LDLIBS) -o test_vectors

test-asan: $(SOURCES) $(HEADERS) $(JAZZ_O)
	$(CC) -Wall -Wextra -std=c11 -Iinclude -Isrc \
	    -fsanitize=address,undefined -g -O1 \
	    $(SOURCES) $(JAZZ_O) $(LDLIBS) -o zupt_asan
	@echo "ASAN build: ./zupt_asan"

help:
	@echo "make / make test / make install / make test-all / make test-asan / make clean"
