# ---------- Variables listed below --------- # # Executable TARGET := main.out # Paths to source, include, dependency, and object files SPATH = src IPATH = inc DPATH = dep OPATH = obj # File type of source file STYPE = cc VPATH = $(SPATH) $(IPATH) $(DPATH) $(OPATH) # compiler and compiler flags CC = g++ CFLAGS = -I$(IPATH) -std=c++11 -Os # list of object files SOURCES = $(wildcard $(SPATH)/*.$(STYPE)) OBJECTS = $(addprefix $(OPATH)/,$(notdir $(SOURCES:.$(STYPE)=.o))) # ----------- Targets listed below ---------- # # Some targets aren't real .PHONY: all clean run dump # Don't autodelete object files: .PRECIOUS: $(OPATH)/%.o all: $(DPATH) $(OPATH) $(TARGET) dump: @echo SOURCES: $(SOURCES) @echo OBJECTS: $(OBJECTS) @echo TARGET: $(TARGET) @echo VPATH: $(VPATH) clean: -rm $(TARGET) -rm -r dep obj run: -$(addprefix ./,$(addsuffix ;,$(TARGET))) $(DPATH) $(OPATH): mkdir -p $@ # Make the executable(s) %.out: $(OBJECTS) $(CC) $(CFLAGS) -o "$@" $^ # Make the object and dependency files $(OPATH)/%.o: $(SPATH)/%.$(STYPE) $(CC) $(CFLAGS) -MMD -MF "$(DPATH)/$(@F:.o=.d)" -o "$@" -c "$<" # --------- Inclusions listed below --------- # # use dependencies when rebuilding -include $(wildcard $(DPATH)/*.d)