# Works only when there is only one target
# You may want to modify it
run_debug: debug
./$(TARGETS_EXE_DEBUG)
# Works only when there is only one target
# You may want to modify it
run_release: release
./$(TARGETS_EXE_RELEASE)
CC := gcc
FLAGS_DEBUG := -g
FLAGS_RELEASE := -O3
BIN_DEBUG := bin/debug
BIN_RELEASE := bin/release
SRC := src
SRCS := $(wildcard $(SRC)/*.c)
TARGET := target
TARGETS := $(wildcard $(TARGET)/*.c)
INCLUDE := include
LIB := lib
LIBRARIES :=
OBJ_DEBUG := obj/debug
OBJS_DEBUG := $(patsubst $(SRC)/%.c,$(OBJ_DEBUG)/%.o,$(SRCS))
OBJ_TARGET_DEBUG := obj/target/debug
OBJS_TARGET_DEBUG := $(patsubst $(TARGET)/%.c,$(OBJ_TARGET_DEBUG)/%.o,$(TARGETS))
OBJ_RELEASE := obj/release
OBJS_RELEASE := $(patsubst $(SRC)/%.c,$(OBJ_RELEASE)/%.o,$(SRCS))
OBJ_TARGET_RELEASE := obj/target/release
OBJS_TARGET_RELEASE := $(patsubst $(TARGET)/%.c,$(OBJ_TARGET_RELEASE)/%.o,$(TARGETS))
DEP := dep
DEPS := $(patsubst $(SRC)/%.c,$(DEP)/%.d,$(SRCS))
DEP_TARGET := dep/target
DEPS_TARGET := $(patsubst $(TARGET)/%.c,$(DEP_TARGET)/%.d,$(TARGETS))
ifeq ($(OS),Windows_NT)
TARGETS_EXE_DEBUG := $(patsubst $(TARGET)/%.c,$(BIN_DEBUG)/%.exe,$(TARGETS))
TARGETS_EXE_RELEASE := $(patsubst $(TARGET)/%.c,$(BIN_RELEASE)/%.exe,$(TARGETS))
RM := del
MKDIR := mkdir
else
TARGETS_EXE_DEBUG := $(patsubst $(TARGET)/%.c,$(BIN_DEBUG)/%,$(TARGETS))
TARGETS_EXE_RELEASE := $(patsubst $(TARGET)/%.c,$(BIN_RELEASE)/%,$(TARGETS))
RM := rm -f
MKDIR := mkdir -p
endif
clean_debug:
$(RM) $(TARGETS_EXE_DEBUG) $(OBJS_DEBUG) $(OBJS_TARGET_DEBUG)
clean_release:
$(RM) $(TARGETS_EXE_RELEASE) $(OBJS_RELEASE) $(OBJS_TARGET_RELEASE)
clean: clean_debug clean_release
$(RM) $(DEPS) $(DEP)/*.d.* $(DEPS_TARGET) $(DEP_TARGET)/*.d.*
$(DEP)/%.d: $(SRC)/%.c
@set -e; \
$(MKDIR) $(DEP); \
$(RM) $@; \
$(CC) -MM -I$(INCLUDE) $< > $@.$$$$; \
sed 's,^.*:,$@ $(OBJ_DEBUG)/$(patsubst $(SRC)/%.c,%,$<).o $(OBJ_RELEASE)/&,g' < $@.$$$$ > $@; \
$(RM) $@.$$$$
$(DEP_TARGET)/%.d: $(TARGET)/%.c
@set -e; \
$(MKDIR) $(DEP_TARGET); \
$(RM) $@; \
$(CC) -MM -I$(INCLUDE) $< > $@.$$$$; \
sed 's,^.*:,$@ $(OBJ_TARGET_DEBUG)/$(patsubst $(TARGET)/%.c,%,$<).o $(OBJ_TARGET_RELEASE)/&,g' < $@.$$$$ > $@; \
$(RM) $@.$$$$
-include $(DEPS)
-include $(DEPS_TARGET)
$(OBJ_DEBUG)/%.o: $(SRC)/%.c $(DEP)/%.d
$(MKDIR) $(OBJ_DEBUG)
$(CC) $(FLAGS_DEBUG) -c -I$(INCLUDE) -L$(LIB) $< -o $@
$(OBJ_TARGET_DEBUG)/%.o: $(TARGET)/%.c $(DEP_TARGET)/%.d
$(MKDIR) $(OBJ_TARGET_DEBUG)
$(CC) $(FLAGS_DEBUG) -c -I$(INCLUDE) -L$(LIB) $< -o $@
$(BIN_DEBUG)/%: $(OBJS_DEBUG) $(OBJ_TARGET_DEBUG)/%.o
$(MKDIR) $(BIN_DEBUG)
$(CC) $^ -o $@ $(LIBRARIES)
debug: $(TARGETS_EXE_DEBUG)
$(OBJ_RELEASE)/%.o: $(SRC)/%.c $(DEP)/%.d
$(MKDIR) $(OBJ_RELEASE)
$(CC) $(FLAGS_RELEASE) -c -I$(INCLUDE) -L$(LIB) $< -o $@
$(OBJ_TARGET_RELEASE)/%.o: $(TARGET)/%.c $(DEP_TARGET)/%.d
$(MKDIR) $(OBJ_TARGET_RELEASE)
$(CC) $(FLAGS_RELEASE) -c -I$(INCLUDE) -L$(LIB) $< -o $@
$(BIN_RELEASE)/%: $(OBJS_RELEASE) $(OBJ_TARGET_RELEASE)/%.o
$(MKDIR) $(BIN_RELEASE)
$(CC) $^ -o $@ $(LIBRARIES)
release: $(TARGETS_EXE_RELEASE)
.PHONY: clean_debug clean_release clean debug run_debug release run_release