CC=gcc EXT=.c FLAGS=-O0 -g DEBUG_FLAGS=-DDEBUG -fsanitize=undefined -fsanitize=address DEPFLAGS=-MD -MP LIBS=$(shell pkg-config --libs xcb x11 xinerama xft json-c cmocka) FLAGS+=$(shell pkg-config --cflags xcb x11 xinerama xft json-c cmocka) EXEC_NAME=wm OBJDIR=obj SRCDIR=src SRC=$(wildcard $(SRCDIR)/*$(EXT)) OBJS=$(patsubst %,$(OBJDIR)/%.o, $(basename $(notdir $(SRC)))) $(shell mkdir -p $(dir $(OBJS)) > /dev/null) $(EXEC_NAME): filter $(OBJS) $(CC) $(FLAGS) $(LIBS) $(OBJS) -o $(EXEC_NAME) debug: debug_flag $(EXEC_NAME) test: compile_test run_test compile_test: filter_test $(OBJS) $(CC) $(DEBUG_FLAGS) $(LIBS) -lcmocka $(OBJS) -o test run_test: ./test $(OBJDIR)/%.o: $(SRCDIR)/%$(EXT) $(CC) $(FLAGS) $(DEPFLAGS) -c -o $@ $< debug_flag: $(eval FLAGS+=$(DEBUG_FLAGS)) filter: $(eval OBJS=$(filter-out obj/tests.o, $(OBJS))) filter_test: $(eval OBJS=$(filter-out obj/main.o, $(OBJS))) .PHONY: clean clean: rm -rf $(OBJDIR) -include $(SRC:$(EXT)=.d)