# PROGRAMS
CC = clang
CXX = clang++
LD = clang
AR = ar
RM = rm -f
TYPST = typst

# COMPILATION FLAGS
LIBS = raylib
ifdef DEBUG
CFLAGS += -Og -g -DDEBUG
else 
CFLAGS += -O2
endif
CFLAGS += -Wall -Wextra -pedantic -std=gnu23 -Iinclude -Werror=return-type $(shell pkg-config --cflags $(LIBS))
LDFLAGS += $(shell pkg-config --libs $(LIBS))

# FILES
SRCS=$(wildcard src/*.c)
DEPS=$(patsubst src/%.c, out/%.d, $(SRCS))
OBJS=$(patsubst src/%.c, out/%.o, $(SRCS))

DOCSRC=$(wildcard docs/*.typ)
DOCS=$(patsubst docs/%.typ, docs/%.pdf, $(DOCSRC))

PROGRAM=ain48

.PHONY: all build docs clean deepclean
all: build docs

build: $(PROGRAM)

docs: $(DOCS)

docs/%.pdf: docs/%.typ
	$(TYPST) c $< $@

clean:
	$(RM) $(PROGRAM)
	$(RM) $(DOCS)
deepclean: clean
	$(RM) $(OBJS)
	$(RM) $(DEPS)
	$(RM) compile_commands.json

$(PROGRAM): $(OBJS)
	$(LD) $(LDFLAGS) $(OBJS) -o $@


out/%.d: src/%.c
	@mkdir -p $(@D)
	@set -e ; $(RM) $@; \
	$(CC) -M $(CFLAGS) $< > $@.$$$$; \
	sed 's,\($*\)\.o[ :]*,out/\1.o $@ : ,g' < $@.$$$$ > $@; \
	$(RM) $@.$$$$

out/%.o: src/%.c
	@mkdir -p $(@D)
	$(CC) $(CFLAGS) -c $< -o $@

include $(DEPS)

