# Hide full compilation line: ifneq ($(V),1) Q?=@ endif # To see full command lines, use make V=1 CC = gcc LD = gcc RM = rm -f MV = mv CP = cp -a MKDIR = mkdir -p CFLAGS ?= -Wall -Werror -O3 CFLAGS += $(MYDEFS) $(MYCFLAGS) $(MYINCLUDES) platform = $(shell uname) ifeq ($(platform),Darwin) AR= /usr/bin/ar rcs RANLIB= /usr/bin/ranlib else AR= ar rcs RANLIB= ranlib endif RM= rm -f RMDIR= rm -rf vpath %.c $(MYSRCPATHS) # Flags to generate temporary dependency files DEPFLAGS = -MT $@ -MMD -MP -MF $(OBJDIR)/$*.Td # make temporary to final dependency files after successful compilation POSTCOMPILE = $(MV) -f $(OBJDIR)/$*.Td $(OBJDIR)/$*.d BINDIR := . OBJDIR := obj MYOBJS = $(MYSRCS:%.c=$(OBJDIR)/%.o) CLEAN = $(foreach bin,$(MYLIBS) $(BINS) $(LIB_A),$(BINDIR)/$(bin)) all: $(foreach bin,$(MYLIBS) $(BINS) $(LIB_A),$(BINDIR)/$(bin)) clean: $(Q)$(RM) $(CLEAN) $(Q)$(RMDIR) $(OBJDIR) .PHONY: all clean $(BINDIR)/$(LIB_A): $(MYOBJS) $(info [=] AR $(notdir $@)) $(Q)$(AR) $@ $(MYOBJS) $(Q)$(RANLIB) $@ $(BINDIR)/% : $(OBJDIR)/%.o $(MYOBJS) $(MYLIBS) $(info [=] LD $(notdir $@)) $(Q)$(LD) $(LDFLAGS) $(MYOBJS) $< -o $@ $(MYLIBS) $(OBJDIR)/%.o : %.c | $(OBJDIR) $(info [-] CC $<) $(Q)$(CC) $(DEPFLAGS) $(CFLAGS) -c -o $@ $< $(Q)$(POSTCOMPILE) $(OBJDIR): $(Q)$(MKDIR) $(OBJDIR) DEPENDENCY_FILES = $(MYOBJS:%.o=%.d) $(BINS:%=$(OBJDIR)/%.d) $(DEPENDENCY_FILES): ; .PRECIOUS: $(DEPENDENCY_FILES) -include $(DEPENDENCY_FILES)