# Makefile For SnowC
# Chris X Edwards - May 2026

CC=gcc
# Debug symbols and full compiler warnings.
FLAGS = -ggdb -Wall

ALLCSRCS := $(wildcard *.c)
ALLEXEC := $(ALLCSRCS:.c=)
#all: $(ALLEXEC)
all: c2snowc snowc2c
%: %.c
	$(CC) -g $(FLAGS) -o $@ $< 
	@echo "== Testing =="
	#@$(MAKE) --no-print-directory test

clean:
	rm -f *.o $(ALLEXEC)
	echo @rm -rf $(BUILD_DIR)

PROJ_DIR := .
TESTING_DIR := $(PROJ_DIR)/testing
C2SNOWC := $(PROJ_DIR)/c2snowc
SNOWC2C := $(PROJ_DIR)/snowc2c
CMP := /usr/bin/diff

TMP_DIR := /tmp/snowc-testing
CHALLENGE_DIR := $(TESTING_DIR)/challenge
ANSWERKEY_DIR := $(TESTING_DIR)/answerkey
VERSCHECK_DIR := $(TMP_DIR)/verscheck

CHALLENGE_FILES := $(wildcard $(CHALLENGE_DIR)/*)
CURRENT_PID := $(shell echo $$$$)
VERSCHECK_DIR := $(VERSCHECK_DIR)-$(CURRENT_PID)

ANSWERKEY_FILES := $(patsubst $(CHALLENGE_DIR)/%.c,$(VERSCHECK_DIR)/%.cno,$(CHALLENGE_FILES))
BASE_FILES := $(basename $(notdir $(CHALLENGE_FILES)))


$(VERSCHECK_DIR) :
	@echo Creating testing directory: $(VERSCHECK_DIR)
	@mkdir -p $(VERSCHECK_DIR)

$(VERSCHECK_DIR)/%.cno : $(CHALLENGE_DIR)/%.c
	@echo "Converting: $< to $@"
	@$(C2SNOWC) $< > $@

test : $(VERSCHECK_DIR) $(ANSWERKEY_FILES)
	@echo "Running Tests..."
	@for F in $(BASE_FILES); do \
	if $(CMP) $(ANSWERKEY_DIR)/$${F}.cno $(VERSCHECK_DIR)/$${F}.cno > /dev/null; \
	then echo "Pass: " $${F} ;\
	else echo "Fail: " $${F} ;\
	pr -w$$(tput cols) -o1 -s'| ' -tm $(CHALLENGE_DIR)/$${F}.c $(VERSCHECK_DIR)/$${F}.cno ; \
	fi \
	done

.PHONY: all test clean bless run

# Bless target: Copies current generated files to ANSWERKEY_DIR
bless:
	@echo "Blessing current outputs..."
	@echo "Blessing complete."

# Optional: Run a single test manually (e.g., make run FILE=test1)
run:
	@if [ -z "$(FILE)" ]; then echo "Usage: make run FILE=test1"; exit 1; fi
	@mkdir -p $(BUILD_DIR)

DIST_FILES = c2snowc.c snowc2c.c Makefile snowc.vim testing
VERSION := $(shell hg log -r . --template '{rev}')

dist:
	tar -czf snowc-$(VERSION).tgz --transform 's|^|snowc-$(VERSION)/|' $(DIST_FILES)
	chmod 644 snowc-$(VERSION).tgz
