# m2SDL3 — GNU Modula-2 bindings for SDL3
GM2      ?= gm2
GM2FLAGS ?=

SRC_DIR := src
LIB_DIR := lib
BLD     := build
OBJDIR  := $(BLD)/objs
OBJS    := $(OBJDIR)/SDL3Rect.o $(OBJDIR)/SDL3Utils.o $(OBJDIR)/SDL3Key.o

# SDL3 sources shipped alongside (read-only, see README): headers in
# SDL-release-3.4.16/include, prebuilt shared lib in .../build.
SDL_SRC := SDL-release-3.4.16
SDL_BLD := $(SDL_SRC)/build
SDL_INC := -I$(SDL_SRC)/include
SDL_LIB := -L$(SDL_BLD) -lSDL3 -Wl,-rpath,$(abspath $(SDL_BLD))

INCLUDES := -I$(SRC_DIR) -I$(LIB_DIR) $(SDL_INC)

TESTS    := test_init test_version test_rect test_window test_key test_sysinfo test_clipboard
EXAMPLES := hello_window version event_loop renderer_demo
SHOWCASES := showcase_clear showcase_rectangles showcase_primitives showcase_snake showcase_lines showcase_points showcase_debug_text

.PHONY: all tests examples showcases clean check

all: tests examples showcases

$(OBJDIR):
	mkdir -p $(OBJDIR)

$(BLD)/tests:
	mkdir -p $(BLD)/tests

$(BLD)/examples:
	mkdir -p $(BLD)/examples

$(OBJDIR)/SDL3Rect.o: $(SRC_DIR)/SDL3Rect.mod $(SRC_DIR)/SDL3Rect.def | $(OBJDIR)
	$(GM2) $(INCLUDES) $(GM2FLAGS) -c $< -o $@

$(OBJDIR)/SDL3Utils.o: $(LIB_DIR)/SDL3Utils.mod $(LIB_DIR)/SDL3Utils.def | $(OBJDIR)
	$(GM2) $(INCLUDES) $(GM2FLAGS) -c $< -o $@

$(OBJDIR)/SDL3Key.o: $(SRC_DIR)/SDL3Key.mod $(SRC_DIR)/SDL3Key.def | $(OBJDIR)
	$(GM2) $(INCLUDES) $(GM2FLAGS) -c $< -o $@

tests: $(BLD)/tests $(OBJS) $(addprefix $(BLD)/tests/,$(TESTS))

$(BLD)/tests/%: tests/%.mod $(OBJS) | $(BLD)/tests
	$(GM2) $(INCLUDES) $(GM2FLAGS) $< $(OBJS) -o $@ $(SDL_LIB)

examples: $(BLD)/examples $(OBJS) $(addprefix $(BLD)/examples/,$(EXAMPLES))

$(BLD)/examples/%: examples/%.mod $(OBJS) | $(BLD)/examples
	$(GM2) $(INCLUDES) $(GM2FLAGS) $< $(OBJS) -o $@ $(SDL_LIB)

$(BLD)/showcases:
	mkdir -p $(BLD)/showcases

showcases: $(BLD)/showcases $(OBJS) $(addprefix $(BLD)/showcases/,$(SHOWCASES))

$(BLD)/showcases/%: showcases/%.mod $(OBJS) | $(BLD)/showcases
	$(GM2) $(INCLUDES) $(GM2FLAGS) $< $(OBJS) -o $@ $(SDL_LIB)

check: tests
	./tests/run_tests.sh

clean:
	rm -rf $(BLD)
