####### Cross-platform settings ifneq (,$(findstring Windows,$(PATH))) UNAME := Windows TARGET_EXT := .exe DEL := del /q SEPERATOR := $(subst /,\,/) MKDIR = if not exist $(subst /,\,$(1)) mkdir $(subst /,\,$(1)) else UNAME := $(shell uname -s) TARGET_EXT := # LFLAGS := -Wl,-s LFLAGS := DEL := rm SEPERATOR := / MKDIR = mkdir -p $(1) endif ####### Output directory TARGET_DIR = bin TEMPDIR = build TARGETBIN = $(TARGET_DIR)/$(TARGET)$(TARGET_EXT) ####### Compiler, tools and options CC = gcc CXX = g++ LINK = g++ STRIP = strip # CFLAGS = -MMD -O0 -Wall $(DEFINES) $(INCLUDES) CFLAGS = -MMD -Wall $(DEFINES) $(INCLUDES) # CXXFLAGS = -fno-exceptions -fno-rtti $(CFLAGS) CXXFLAGS = $(CFLAGS) LINKFLAGS = $(LFLAGS) STRIPFLAGS = ####### Intermediate files OBJECTS = $(patsubst %.cpp,$(TEMPDIR)/%.o,$(SOURCES)) DEPENDS = $(patsubst %.o,%.d,$(OBJECTS)) ####### Build rules all: $(TARGETBIN) .PHONY: clean clean: $(DEL) $(subst /,$(SEPERATOR),$(OBJECTS) $(DEPENDS) $(TARGETBIN)) ####### Implicit rules -include $(DEPENDS) .SUFFIXES: .cpp .c build/%.o : %.cpp $(call MKDIR,$(dir $@)) $(CXX) -c $(CXXFLAGS) -o $@ $< build/%.o : %.c $(call MKDIR,$(dir $@)) $(CC) -c $(CFLAGS) -o $@ $< ####### Compile $(TARGETBIN): $(OBJECTS) $(call MKDIR,$(dir $@)) $(LINK) $(LINKFLAGS) -o $@ $^ $(LIBS) # $(TARGETBIN) # $(STRIP) $(STRIPFLAGS) $@