# auto-dependency generation makefile #### Default values SRCEXTENSIONS := c C cpp CC := gcc CPP := g++ LD := ld AR := ar #### build object directory token CPU := $(shell uname -m) OS := $(shell uname -s | tr '[A-Z]' '[a-z]') DEFAULT_ARCH := $(CPU)-$(OS) ifeq ($(strip $(ARCH)),) ARCH := $(DEFAULT_ARCH) endif OBJTOKEN := obj.$(ARCH) # # Under most circumstances, paths are simple # ifeq ($(POSTROOT),..) MODPATH := . OBJDIR := $(OBJTOKEN) else MODPATH := $(POSTROOT)/$(MODULENAME) OBJDIR := $(MODPATH)/$(OBJTOKEN) endif # # Directories # MODLIBS := \ -L$(OBJDIR) \ $(foreach dir, $(MODULES), -L$(POSTROOT)/$(dir)/$(OBJTOKEN)) MODINCLUDES := \ -I$(MODPATH)/include \ $(foreach dir, $(MODULES), -I$(POSTROOT)/$(dir)/include) ALLTARGETS := \ $(foreach targ, $(TARGETS), $(OBJDIR)/$(targ)) VPATH := \ $(MODPATH)/include \ $(foreach dir, $(SRCDIRS), $(MODPATH)/$(dir)) \ $(foreach dir, $(MODULES), $(POSTROOT)/$(dir)/include) #### include paths LIBPATH := $(MODLIBS) INCLUDEPATH += -I. -Iinclude $(MODINCLUDES) KCFLAGS = -O2 \ -Wall -Werror -Wstrict-prototypes \ -fno-strict-aliasing -fomit-frame-pointer \ -DMODULE -D__KERNEL__ CFLAGS := -fPIC -Wall -O2 -g CCFLAGS := -Werror CPPFLAGS := -ftemplate-depth-30 #### Architecture deps KERNEL_INCLUDE := $(KERNEL_HOME)/include BINSTRIP := strip KCFLAGS += $(INCLUDEPATH) CFLAGS += $(INCLUDEPATH) $(LIBPATH) CCFLAGS += $(CFLAGS) CPPFLAGS += $(CFLAGS) # # targets # default: $(ALLTARGETS) #################################################### # # Dependency generation # # Get list of all source files SOURCES := \ $(notdir $(wildcard \ $(foreach dir, $(SRCDIRS), \ $(foreach ext, $(SRCEXTENSIONS), $(dir)/*.$(ext))))) # Convert all .c, .cpp, .C to .d SRC_AND_DEPENDS := $(foreach ext, $(SRCEXTENSIONS),\ $(patsubst %.$(ext),%.d,$(SOURCES))) DEPENDS := $(foreach file, $(filter %.d,$(SRC_AND_DEPENDS)), $(OBJDIR)/$(file)) BASE = $(subst /,\/,$*) ODIR = $(subst /,\/,$(OBJDIR)) # This magic is from the 'make' manual (with mods by jelson) $(OBJDIR)/%.d: %.c @mkdir -p $(OBJDIR) set -e; $(CC) -MM -I$(KERNEL_INCLUDE) $(CFLAGS) $< \ | sed 's/\($(BASE)\)\.o[ :]*/$(ODIR)\/$(BASE).o $(ODIR)\/$(BASE).d : /g' > $@; \ [ -s $@ ] || rm -f $@ $(OBJDIR)/%.d: %.C @mkdir -p $(OBJDIR) set -e; $(CC) -MM $(CPPFLAGS) $< \ | sed 's/\($(BASE)\)\.o[ :]*/$(ODIR)\/$(BASE).o $(ODIR)\/$(BASE).d : /g' > $@; \ [ -s $@ ] || rm -f $@ $(OBJDIR)/%.d: %.cpp @mkdir -p $(OBJDIR) set -e; $(CC) -MM $(CPPFLAGS) $< \ | sed 's/\($(BASE)\)\.o[ :]*/$(ODIR)\/$(BASE).o $(ODIR)\/$(BASE).d : /g' > $@; \ [ -s $@ ] || rm -f $@ # # Rules # $(OBJDIR)/%.o: %.cpp $(CPP) $(CPPFLAGS) $< -c -o $@ $(OBJDIR)/%.o: %.C $(CPP) $(CPPFLAGS) $< -c -o $@ $(OBJDIR)/%.o: %.c $(CC) $(CCFLAGS) $< -c -o $@ clean: rm -f $(ALLTARGETS) $(OBJDIR)/*.[oa] $(OBJDIR)/*.so.* $(DEPENDS) include $(DEPENDS)