GRADER_OUT := simplecity
GRADER_LEAK_OUT := simplecity-leak
UNIT_OUT := simplecity-unit-testing
UNIT_LEAK_OUT := simplecity-unit-testing-leak

COMMON_SRCS := GameEngine.cpp City.cpp buildings/Building.cpp buildings/Health.cpp buildings/Revenue.cpp buildings/Residential.cpp buildings/Clinic.cpp buildings/Hospital.cpp buildings/SilverMine.cpp buildings/GoldMine.cpp buildings/House.cpp buildings/Apartment.cpp
GRADER_SRCS := $(COMMON_SRCS) main_cli.cpp
UNIT_SRCS := $(COMMON_SRCS) UnitTesting.cpp

GRADER_OBJS := $(patsubst %.cpp,%.o,$(GRADER_SRCS))
GRADER_LEAK_OBJS := $(patsubst %.cpp,%-leak.o,$(GRADER_SRCS))
UNIT_OBJS := $(patsubst %.cpp,%.o,$(UNIT_SRCS))
UNIT_LEAK_OBJS := $(patsubst %.cpp,%-leak.o,$(UNIT_SRCS))

CXX := g++
CXXFLAGS := -std=c++11 -Iinclude
LEAK_FLAGS := -fsanitize=address,leak,undefined -g
LDFLAGS :=

ifeq (Windows_NT, $(OS))
RM := del
else
RM := rm -f
endif

.PHONY: all
all: $(GRADER_OUT) $(UNIT_OUT)


$(GRADER_OUT): $(GRADER_OBJS)
	$(CXX) -o $@ $^ $(LDFLAGS)

$(UNIT_OUT): $(UNIT_OBJS)
	$(CXX) -o $@ $^ $(LDFLAGS)

$(GRADER_LEAK_OUT): $(GRADER_LEAK_OBJS)
	$(CXX) -o $@ $^ $(LEAK_FLAGS) $(LDFLAGS)

$(UNIT_LEAK_OUT): $(UNIT_LEAK_OBJS)
	$(CXX) -o $@ $^ $(LEAK_FLAGS) $(LDFLAGS)

%.o: %.cpp
	$(CXX) $(CXXFLAGS) -o $@ -c $<

%-leak.o: %.cpp
	$(CXX) $(CXXFLAGS) $(LEAK_FLAGS) -o $@ -c $<

.PHONY: clean
clean:
	$(RM) $(GRADER_OUT) $(UNIT_OUT) $(GRADER_LEAK_OUT) $(UNIT_LEAK_OUT) $(GRADER_OBJS) $(UNIT_OBJS) $(GRADER_LEAK_OBJS) $(UNIT_LEAK_OBJS)
