DEBUG=1
LLVM_SAN=1

ifeq ($(DEBUG),1)
DEBUG_CFLAGS=-g
else
DEBUG_CFLAGS=-D_NDEBUG
endif

ifeq ($(LLVM_SAN),1)
LLVM_SAN_FLAGS=-fsanitize=address,undefined
else
LLVM_SAN_FLAGS=
endif

CC=gcc
CFLAGS=$(DEBUG_CFLAGS) $(LLVM_SAN_FLAGS) -std=c11 -Wall -Wpedantic $\
       -D_POSIX_C_SOURCE=200112L
LD=gcc
LDFLAGS=$(LLVM_SAN_FLAGS)

SRCS:=$(wildcard src/*.c)
OBJS:=$(SRCS:src/%.c=bin/%.o)
DEPS:=$(SRCS:src/%.c=bin/deps/%.d)

SRCS += bin/init_globals.c
OBJS += bin/init_globals.o
DEPS += bin/deps/init_globals.o

HEADERS=$(wildcard src/*.h)
SRCS_WITH_HEADERS=$(filter $(HEADERS:src/%.h=src/%.c),$(SRCS))

glisp: $(OBJS)
	$(LD) $(LDFLAGS) -o $@ $^

bin/init_globals.c: $(filter-out bin/init_globals.c,$(SRCS_WITH_HEADERS)) src/gen-init-globals.awk
	awk -f src/gen-init-globals.awk $(filter-out src/gen-init-globals.awk,$^) >$@

bin/%.o: src/%.c
	@mkdir -p $(dir $(<:src/%.c=bin/deps/%.d) $(<:src/%.c=bin/%))
	$(CC) $(CFLAGS) -c -MMD -MF $(<:src/%.c=bin/deps/%.d) -I src/ -o $@ $<

bin/init_globals.o: bin/init_globals.c
	@mkdir -p bin/deps
	$(CC) $(CFLAGS) -Isrc/ -c -MMD -MF bin/deps/init_globals.d -o $@ $<

clean:
	rm -rf glisp bin/

.PHONY: clean

-include $(DEPS)
