
# ---------- Variables listed below --------- #
# Executable
TARGET := chernobyl.out

# Paths to source, include, dependency, and object files
SPATH = src
IPATH = inc
DPATH = dep
OPATH = obj

# File type of source file
STYPE = c

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)
