BIN = bst SRC = main.cpp CC = g++ CFLAGS = -Wall -std=gnu++98 -pedantic -MD DBGFLAGS = -g -O0 ifdef DEBUG CFLAGS += $(DBGFLAGS) else CFLAGS += -O2 -march=native -mtune=native endif LDFLAGS = -lm OBJ_DIR = obj DEPS_DIR = obj BIN_DIR = bin CPP_FILES = $(filter %.cpp, $(SRC)) DEP_FILES = $(addprefix $(DEPS_DIR)/, $(addsuffix .d, $(notdir $(subst .cpp,,$(SRC))))) OBJ_FILES = $(addprefix $(OBJ_DIR)/, $(addsuffix .o, $(notdir $(subst .cpp,,$(SRC))))) INCL = -I/include define CPP_template $(1): $(2) @mkdir -p $$(OBJ_DIR) @mkdir -p $$(DEPS_DIR) $$(CC) -c $$(CFLAGS) $$(INCL) $$< -o $$@ endef all: $(BIN) $(foreach cppfile, $(CPP_FILES), $(eval $(call CPP_template, $(OBJ_DIR)/$(notdir $(subst .cpp,,$(cppfile))).o, $(cppfile)))) $(BIN): $(OBJ_FILES) @mkdir -p $(BIN_DIR) $(CC) $(LDFLAGS) $(OBJ_FILES) -o $(BIN_DIR)/$@ .PHONY: clean clean: rm -rf $(OBJ_DIR) rm -f $(BIN_DIR)/$(BIN) -include $(DEP_FILES)