TARGET_EXEC := smokey CFLAGS := $(shell sed 's|//.*||' compile_flags.txt) LD_FLAGS := -lglfw SRC_DIR := src BUILD_DIR := out SRCS_NOMAIN := $(shell find $(SRC_DIR) -name '*.c' ! -name 'main.c') SRCS := $(SRCS_NOMAIN) $(DEPS) $(SRC_DIR)/main.c OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) DEPS := $(OBJS:.o=.d) INC_DIRS := $(shell find $(SRC_DIR) -type d) INC_FLAGS := -MMD -MP $(addprefix -I,$(INC_DIRS)) THIRDPARTY_DIR := deps THIRDPARTY_SRCS := $(shell find $(THIRDPARTY_DIR) -name '*.c') THIRDPARTY_OBJS := $(THIRDPARTY_SRCS:%=$(BUILD_DIR)/%.o) THIRDPARTY_DEPS := $(THIRDPARTY_OBJS:.o=.d) TEST_DIR := test TEST_SRCS := $(shell find $(TEST_DIR) -name '*.test.c') TEST_OBJS := $(SRCS_NOMAIN:%=$(BUILD_DIR)/%.o) TEST_EXECS := $(TEST_SRCS:%.c=$(BUILD_DIR)/%) TEST_INC_DIRS := $(shell find $(TEST_DIR) -type d) TEST_INC_FLAGS := -MMD -MP $(addprefix -I,$(TEST_INC_DIRS)) all: build build: $(TARGET_EXEC) $(TARGET_EXEC): $(THIRDPARTY_OBJS) $(OBJS) $(CC) $(CFLAGS) $(LD_FLAGS) $(THIRDPARTY_OBJS) $(OBJS) -o $@ $(BUILD_DIR)/$(THIRDPARTY_DIR)/%.c.o: $(THIRDPARTY_DIR)/%.c mkdir -p $(dir $@) $(CC) -c $< -o $@ $(BUILD_DIR)/%.c.o: %.c mkdir -p $(dir $@) $(CC) $(CFLAGS) $(INC_FLAGS) -c $< -o $@ run-tests: build-tests for exec in $(TEST_EXECS); do ./$$exec; done build-tests: $(TEST_EXECS) $(BUILD_DIR)/$(TEST_DIR)/%.test: $(BUILD_DIR)/$(TEST_DIR)/%.test.c.o $(TEST_OBJS) $(CC) $(CFLAGS) $(LD_FLAGS) $^ -o $@ $(BUILD_DIR)/$(TEST_DIR)/%.test.c.o: $(TEST_DIR)/%.c mkdir -p $(dir $@) $(CC) $(CFLAGS) $(TEST_INC_FLAGS) -c $< -o $@ clean: -$(RM) -rdf $(TARGET_EXEC) $(BUILD_DIR) .PHONY: all build run-tests build-tests clean -include $(DEPS) $(THIRDPARTY_DEPS)