##============================================================================== ## ## Phony targets. ## ##============================================================================== .PHONY: gen all clean depend memcheck cachegrind proj ##============================================================================== ## ## OpenSSL ## ##============================================================================== ifdef CONFIG_TOOLCHAIN OPENSSL_CFLAGS=-I$(CONFIG_TOOLCHAIN)/usr/include OPENSSL_LIBS=-L$(CONFIG_TOOLCHAIN)/usr/lib -lssl -lcrypto OPENSSL_LIBDIR=$(CONFIG_TOOLCHAIN)/usr/lib export LD_LIBRARY_PATH=$(CONFIG_TOOLCHAIN)/lib:$(CONFIG_TOOLCHAIN)/usr/lib else OPENSSL_CFLAGS=$(shell $(PKGCONFIG) --cflags openssl) OPENSSL_LIBS=$(shell $(PKGCONFIG) --libs openssl) OPENSSL_LIBDIR=$(shell $(PKGCONFIG) --variable=libdir openssl) endif ##============================================================================== ## ## OBJDIRPATH -- resolve directory where objects will go. ## ##============================================================================== OBJDIRPATH=$(OBJDIR)$(subst $(ROOT),,$(CURDIR)) ifeq ($(subst $(ROOT),,$(CURDIR)), $(ROOT)) $(error "current directory seems to be a symbolic link") endif ##============================================================================== ## ## Obtain build flags with 'buildtool'. ## ##============================================================================== BUILDTOOL=$(ROOT)/buildtool CC=$(shell $(BUILDTOOL) cc) CXX=$(shell $(BUILDTOOL) cxx) __OPTS= ifeq ($(ENABLE_DEBUG),1) __OPTS += --debug endif ifeq ($(ENABLE_WERROR),1) __OPTS += --errwarn endif __OPTS += --pic CFLAGS=$(shell $(BUILDTOOL) cflags $(__OPTS)) CFLAGS+=$(OPENSSL_CFLAGS) CXXFLAGS=$(shell $(BUILDTOOL) cxxflags $(__OPTS)) CXXFLAGS+=$(OPENSSL_CFLAGS) ifdef DISABLE_LIBPATH LIBPATHFLAGS=$(shell $(BUILDTOOL) libpath $(OPENSSL_LIBDIR)) else LIBPATHFLAGS=$(shell $(BUILDTOOL) libpath $(CONFIG_LIBDIR) $(OPENSSL_LIBDIR)) endif CSHLIBFLAGS=$(shell $(BUILDTOOL) cshlibflags) CSHLIBFLAGS+=$(shell $(BUILDTOOL) syslibs) CSHLIBFLAGS+=$(OPENSSL_LIBS) CSHLIBFLAGS+=$(LIBPATHFLAGS) CXXSHLIBFLAGS=$(shell $(BUILDTOOL) cxxshlibflags) CXXSHLIBFLAGS+=$(shell $(BUILDTOOL) syslibs) CXXSHLIBFLAGS+=$(OPENSSL_LIBS) CXXSHLIBFLAGS+=$(LIBPATHFLAGS) CPROGFLAGS=$(shell $(BUILDTOOL) cprogflags) CPROGFLAGS+=$(shell $(BUILDTOOL) syslibs) CPROGFLAGS+=$(OPENSSL_LIBS) CPROGFLAGS+=$(LIBPATHFLAGS) CXXPROGFLAGS=$(shell $(BUILDTOOL) cxxprogflags) CXXPROGFLAGS+=$(shell $(BUILDTOOL) syslibs) CXXPROGFLAGS+=$(OPENSSL_LIBS) CXXPROGFLAGS+=$(LIBPATHFLAGS) ##============================================================================== ## ## OBJECTS: ## ##============================================================================== __TMP = $(SOURCES:.c=.o) __TMP2 = $(__TMP:.s=.o) OBJECTS = $(__TMP2:.cpp=.o) __OBJECTS = $(addprefix $(OBJDIRPATH)/,$(OBJECTS)) ##============================================================================== ## ## LIBRARY target ## ##============================================================================== ifdef LIBRARY FOUND = 1 $(shell mkdir -p $(OBJDIRPATH)) ifndef TOP $(error "Please define TOP variable") endif ifndef SOURCES $(error "Please define SOURCES variable") endif TARGET = $(LIBDIR)/lib$(LIBRARY).a $(TARGET): $(__OBJECTS) mkdir -p $(LIBDIR) ar r $(TARGET) $(__OBJECTS) @ echo # ranlib $(TARGET) endif ##============================================================================== ## ## CSHLIBRARY target ## ##============================================================================== ifdef CSHLIBRARY FOUND = 1 $(shell mkdir -p $(OBJDIRPATH)) ifndef TOP $(error "Please define TOP variable") endif ifndef SOURCES $(error "Please define SOURCES variable") endif TARGET = $(LIBDIR)/$(shell $(BUILDTOOL) shlibname $(CSHLIBRARY)) __LIBRARIES = $(addprefix -l,$(LIBRARIES)) __LIBRARIES += $(addprefix -l,$(SYSLIBRARIES)) ifndef DISABLE_LIBPATH LIBNAMEOPT=$(shell $(BUILDTOOL) libname $(CONFIG_LIBDIR)/$(shell $(BUILDTOOL) shlibname $(CSHLIBRARY))) endif $(TARGET): $(__OBJECTS) mkdir -p $(LIBDIR) $(CC) -o $(TARGET) $(__OBJECTS) -L$(LIBDIR) $(__LIBRARIES) $(CSHLIBFLAGS) $(LIBNAMEOPT) @ echo chklib: $(BINDIR)/chklib $(TARGET) endif ##============================================================================== ## ## CXXSHLIBRARY target ## ##============================================================================== ifdef CXXSHLIBRARY FOUND = 1 $(shell mkdir -p $(OBJDIRPATH)) ifndef TOP $(error "Please define TOP variable") endif ifndef SOURCES $(error "Please define SOURCES variable") endif TARGET = $(LIBDIR)/$(shell $(BUILDTOOL) shlibname $(CXXSHLIBRARY)) __LIBRARIES = $(addprefix -l,$(LIBRARIES)) __LIBRARIES += $(addprefix -l,$(SYSLIBRARIES)) ifndef DISABLE_LIBPATH LIBNAMEOPT=$(shell $(BUILDTOOL) libname $(CONFIG_LIBDIR)/$(shell $(BUILDTOOL) shlibname $(CXXSHLIBRARY))) endif $(TARGET): $(__OBJECTS) mkdir -p $(LIBDIR) $(CXX) -o $(TARGET) $(__OBJECTS) -L$(LIBDIR) $(__LIBRARIES) $(CXXSHLIBFLAGS) $(LIBNAMEOPT) @ echo chklib: $(BINDIR)/chklib $(TARGET) endif ##============================================================================== ## ## CPROGRAM target ## ##============================================================================== ifdef CPROGRAM FOUND = 1 $(shell mkdir -p $(OBJDIRPATH)) ifndef TOP $(error "Please define TOP variable") endif ifndef SOURCES $(error "Please define SOURCES variable") endif TARGET = $(BINDIR)/$(CPROGRAM) __LIBRARIES = $(addprefix -l,$(LIBRARIES)) __LIBRARIES += $(addprefix -l,$(SYSLIBRARIES)) __DEPS=$(wildcard $(addprefix $(LIBDIR)/lib,$(addsuffix .*,$(LIBRARIES)))) $(TARGET): $(__OBJECTS) $(__DEPS) mkdir -p $(BINDIR) $(CC) -o $(TARGET) $(__OBJECTS) -L$(LIBDIR) $(__LIBRARIES) $(CPROGFLAGS) @ echo endif ##============================================================================== ## ## CXXPROGRAM target ## ##============================================================================== ifdef CXXPROGRAM FOUND = 1 $(shell mkdir -p $(OBJDIRPATH)) ifndef TOP $(error "Please define TOP variable") endif ifndef SOURCES $(error "Please define SOURCES variable") endif TARGET = $(BINDIR)/$(CXXPROGRAM) __LIBRARIES = $(addprefix -l,$(LIBRARIES)) __LIBRARIES += $(addprefix -l,$(SYSLIBRARIES)) __DEPS=$(wildcard $(addprefix $(LIBDIR)/lib,$(addsuffix .*,$(LIBRARIES)))) all: $(TARGET) $(EXTRA_RULE) $(TARGET): $(__OBJECTS) $(__DEPS) mkdir -p $(BINDIR) $(CXX) -o $(TARGET) $(__OBJECTS) -L$(LIBDIR) $(__LIBRARIES) $(CXXPROGFLAGS) @ echo endif ##============================================================================== ## ## DIRECTORIES target ## ##============================================================================== ifdef DIRECTORIES FOUND = 1 # define a newline macro define NL endef all: @ $(foreach i, $(DIRECTORIES), $(MAKE) -C $i $(NL) ) clean: @ $(foreach i, $(DIRECTORIES), $(MAKE) -C $i clean $(NL) ) depend: @ $(foreach i, $(DIRECTORIES), $(MAKE) -C $i depend $(NL) ) endif ##============================================================================== ## ## Check that one of the targets above was defined ## ##============================================================================== ifndef FOUND TARGETS = \ LIBRARY \ LIBDIR \ CSHLIBRARY \ CXXSHLIBRARY \ CPROGRAM \ CXXPROGRAM \ DIRECTORIES $(error "Please define one of the following targets: $(TARGETS)") endif ##============================================================================== ## ## USECCACHE ## ##============================================================================== ifdef USECCACHE CWRAP=ccache CXXWRAP=$(CWRAP) endif ##============================================================================== ## ## Object file targets ## ##============================================================================== __INCLUDES = -I$(INCDIR) $(addprefix -I,$(INCLUDES)) __DEFINES = $(addprefix -D,$(DEFINES)) compilec = \ $(CWRAP) $(CC) -c -o $@ $(CFLAGS) $(__INCLUDES) $(__DEFINES) $(1) $(2) compilecxx = \ $(CXXWRAP) $(CXX) -c -o $@ $(CXXFLAGS) $(__INCLUDES) $(__DEFINES) $(1) $(2) compiles = \ $(CC) -c -o $@ $(CFLAGS) $(__INCLUDES) $(__DEFINES) $(1) $(2) $(OBJDIRPATH)/%.o: %.c $(call compilec,$<) @ echo $(OBJDIRPATH)/%.o: %.cpp $(call compilecxx,$<) @ echo $(OBJDIRPATH)/%.o: %.s $(call compiles,$<) @ echo ##============================================================================== ## ## clean target ## ##============================================================================== ifndef DIRECTORIES clean: rm -rf $(TARGET) $(__OBJECTS) $(OBJDIRPATH)/depend.mak $(CLEANFILES) endif ##============================================================================== ## ## depend target ## ##============================================================================== MKDEP=$(BINDIR)/mkdep ifndef DIRECTORIES depend: $(BINDIR)/mkdep $(MKDEP) --objdir $(OBJDIRPATH) $(__INCLUDES) $(SOURCES) > $(OBJDIRPATH)/depend.mak endif # Only build if we are not in the mkdep source directory. ifndef MAKEDEPSRCDIR $(BINDIR)/mkdep: $(MAKE) -C $(ROOT)/tools/mkdep endif ##============================================================================== ## ## memcheck target ## ##============================================================================== MEMCHECK=valgrind --tool=memcheck --leak-check=full --error-exitcode=1 --gen-suppressions=all --track-fds=yes ## --trace-children=yes ifdef MEMCHECK_SUPPRESS __MEMCHECK_SUPPRESS = --suppressions=$(MEMCHECK_SUPPRESS) endif memcheck: $(MEMCHECK) $(__MEMCHECK_SUPPRESS) $(TARGET) $(MEMCHECK_ARGS) ##============================================================================== ## ## cachegrind target ## ##============================================================================== CACHEGRIND=valgrind --tool=cachegrind cachegrind: $(CACHEGRIND) --cachegrind-out-file=callgrind.out $(TARGET) $(ARGUMENTS) $(MEMCHECK_ARGS) cg_annotate --auto=yes callgrind.out > cg_annotate.out rm -f callgrind.out @ echo "Created cg_annotate.out" ##============================================================================== ## ## Include depend.mak ## ##============================================================================== -include $(OBJDIRPATH)/depend.mak