# m2SDL — GNU Modula-2 bindings for SDL2
GM2      ?= gm2
SDLCONF  := $(shell pkg-config --cflags sdl2 2>/dev/null)
SDLLIBS  := $(shell pkg-config --libs sdl2 2>/dev/null || echo -lSDL2)
GM2FLAGS ?=

SRC_DIR := src
LIB_DIR := lib
BLD     := build
OBJDIR  := $(BLD)/objs
OBJS    := $(OBJDIR)/SDLRect.o $(OBJDIR)/SDLUtils.o $(OBJDIR)/SDLKey.o

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

TESTS    := test_init test_version test_rect test_window test_key
EXAMPLES := hello_window version event_loop
SHOWCASES := showcase_clear showcase_rectangles showcase_primitives showcase_snake

.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)/SDLRect.o: $(SRC_DIR)/SDLRect.mod $(SRC_DIR)/SDLRect.def | $(OBJDIR)
	$(GM2) $(INCLUDES) $(GM2FLAGS) -c $< -o $@

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

$(OBJDIR)/SDLKey.o: $(SRC_DIR)/SDLKey.mod $(SRC_DIR)/SDLKey.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) $(SDLCONF) $< $(OBJS) -o $@ $(SDLLIBS)

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

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

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

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

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

check: tests
	./tests/run_tests.sh

clean:
	rm -rf $(BLD)
