# stdrules.mak --- Standard Building Rules Makefile part # --------------------------------------------------------------------------- # This Makefile system relies on some features solely made available in the # GNU environment. # # Required configuration variables: # NAME = # TYPE = staticlib / sharedlib / executable # BASETARGETDIR = ../bin # Targets defined: # 'all' Builds target. # 'mostlyclean' Removes objects and source backups. # 'clean' Removes objects and target. # 'clobber' cf. clean also removing generated dependency files. # --------------------------------------------------------------------------- # Useful references: # http://www.gnu.org/software/make/manual/make.html#Prerequisite-Types # http://www.gnu.org/software/make/manual/make.html#Automatic-Prerequisites # http://www.mingw.org/wiki/sampleDLL # # ifeq ($(OS),Windows_NT) ECHO = /bin/echo.exe -e MKDIR = /bin/mkdir.exe -p CP = /bin/cp.exe SED = /bin/sed.exe else ECHO = /bin/echo -e MKDIR = /bin/mkdir -p CP = /bin/cp SED = /bin/sed endif ifeq ($(OSTYPE),) OSTYPE = `uname -o` $(info OSTYPE set to $(OSTYPE)) endif ifeq ($(HOSTTYPE),) HOSTTYPE = `uname -m` $(info HOSTTYPE set to $(HOSTTYPE)) endif ARCH = $(OSTYPE)-$(HOSTTYPE) ifeq ($(BASETARGETDIR),) BASETARGETDIR = ../bin $(info BASETARGETDIR set to $(BASETARGETDIR)) endif ifeq ($(origin DEBUG), undefined) TARGETDIR = $(BASETARGETDIR)/$(ARCH) else CFLAGS += $(DEBUGFLAGS) CXXFLAGS += $(DEBUGFLAGS) TARGETDIR = $(BASETARGETDIR)-debug/$(ARCH) endif ifneq (,$(findstring staticlib,$(TYPE))) TARGET = lib$(NAME).a TARGETRECIPE = $(AR) $(ARFLAGS) $(TARGETDIR)/$(TARGET) $? # $(info ($(TYPE)) TARGETRECIPE = $(TARGETRECIPE)) else ifneq (,$(findstring sharedlib,$(TYPE))) ifeq ($(OS),Windows_NT) TARGET = $(NAME).dll TARGETIMP = $(TARGETDIR)/lib$(NAME).dll.a TARGETRECIPE = $(LINK.o) -shared $^ -Wl,--out-implib,$(TARGETIMP) $(LOADLIBES) $(LDLIBS) -o $@ else TARGET = lib$(NAME).so TARGETRECIPE = $(LINK.o) -shared $^ $(LOADLIBES) $(LDLIBS) -o $@ endif # $(info ($(TYPE)) TARGETRECIPE = $(TARGETRECIPE)) else TARGET = $(NAME) TARGETRECIPE = $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@ # $(info ($(TYPE)) TARGETRECIPE = $(TARGETRECIPE)) endif endif #SOURCES = $(strip $(wildcard *.c) \ # $(wildcard *.cc) \ # $(wildcard *.cpp) \ # $(wildcard *.cxx) \ # ) OBJECTS = $(strip $(patsubst %.c,$(TARGETDIR)/%.o,$(wildcard *.c)) \ $(patsubst %.cc,$(TARGETDIR)/%.o,$(wildcard *.cc)) \ $(patsubst %.cpp,$(TARGETDIR)/%.o,$(wildcard *.cpp)) \ $(patsubst %.cxx,$(TARGETDIR)/%.o,$(wildcard *.cxx)) \ ) DEPENDENCIES = $(OBJECTS:%.o=%.d) #$(info DEPENDENCIES = $(DEPENDENCIES)) .PHONY: all mostlyclean clean clobber run debug all: $(TARGETDIR)/$(TARGET) $(TARGETDIR)/$(TARGET): $(OBJECTS) $(TARGETRECIPE) mostlyclean: $(RM) $(OBJECTS) *~ clean: $(RM) $(TARGETDIR)/$(TARGET) $(TARGETIMP) $(OBJECTS) clobber: $(RM) $(TARGETDIR)/$(TARGET) $(TARGETIMP) $(OBJECTS) $(DEPENDENCIES) run: $(TARGETDIR)/$(TARGET) $(TARGETDIR)/$(TARGET) ### target dir existence rules $(TARGETDIR)/$(TARGET) $(TARGETIMP) $(OBJECTS) $(DEPENDENCIES): | $(TARGETDIR) $(TARGETDIR): $(MKDIR) $(TARGETDIR) ### dependencies building rules in target dir # DEPENDENCYRECIPE.c = \ # set -e; $(RM) $@; \ # $(ECHO) '$$(info including $@...)' > $@.$$$$; \ # $(CC) -MM $(CPPFLAGS) -MP $< >> $@.$$$$; \ # $(SED) 's,\($*\)\.o[ :]*,$(TARGETDIR)/\1.o $@ : ,g' < $@.$$$$ > $@; \ # $(RM) $@.$$$$ # DEPENDENCYRECIPE.cc = \ # set -e; $(RM) $@; \ # $(ECHO) '$$(info including $@...)' > $@.$$$$; \ # $(CXX) -MM $(CPPFLAGS) -MP $< >> $@.$$$$; \ # $(SED) 's,\($*\)\.o[ :]*,$(TARGETDIR)/\1.o $@ : ,g' < $@.$$$$ > $@; \ # $(RM) $@.$$$$ DEPENDENCYRECIPE.c = \ $(ECHO) '$$(info including $@...)' > $@; \ $(CC) $(CPPFLAGS) -MM -MP -MT '$(patsubst %.d,%.o,$@) $@' $< >> $@ DEPENDENCYRECIPE.cc = \ $(ECHO) '$$(info including $@...)' > $@; \ $(CXX) $(CPPFLAGS) -MM -MP -MT '$(patsubst %.d,%.o,$@) $@' $< >> $@ #$(info DEPENDENCYRECIPE.cc = $(DEPENDENCYRECIPE.cc)) .PRECIOUS: $(TARGETDIR)/%.d $(TARGETDIR)/%.d: %.c @$(ECHO) 'generating $@...' @$(DEPENDENCYRECIPE.c) $(TARGETDIR)/%.d: %.cc @$(ECHO) 'generating $@...' @$(DEPENDENCYRECIPE.cc) $(TARGETDIR)/%.d: %.cpp @$(ECHO) 'generating $@...' @$(DEPENDENCYRECIPE.cc) $(TARGETDIR)/%.d: %.cxx @$(ECHO) 'generating $@...' @$(DEPENDENCYRECIPE.cc) ### objects building rules in target dir $(TARGETDIR)/%.o : %.cc $(TARGETDIR)/%.d $(COMPILE.cc) $(OUTPUT_OPTION) $< $(TARGETDIR)/%.o : %.cpp $(TARGETDIR)/%.d $(COMPILE.cpp) $(OUTPUT_OPTION) $< $(TARGETDIR)/%.o : %.cxx $(TARGETDIR)/%.d $(COMPILE.cxx) $(OUTPUT_OPTION) $< ### using generated dependencies -include $(DEPENDENCIES)