# Top-level Makefile fragment for Hubbub # Default target all: release # Name of component COMPONENT := libhubbub # Environment EXPORT := $(CURDIR)/dist TOP := $(CURDIR) RELEASEDIR := build/Release DEBUGDIR := build/Debug COVERAGEDIR := build/coverage # List of items to delete on clean ITEMS_CLEAN := # List of items to delete on distclean ITEMS_DISTCLEAN := # List of targets to run for testing TARGET_TESTS := # Source files SOURCES := # Include Makefile fragments in subdirectories define do_include DIR := $$(dir $(1)) include $(1) endef MAKE_INCLUDES := $(wildcard */Makefile) $(eval $(foreach INC, $(MAKE_INCLUDES), $(call do_include,$(INC)))) # Calculate objects to build OBJECTS := $(subst /,_,$(subst .c,.o,$(SOURCES))) .PHONY: release debug test coverage profile \ clean distclean setup export install uninstall # Rules release: setup $(addprefix $(RELEASEDIR)/,$(OBJECTS)) @$(AR) $(ARFLAGS) $(COMPONENT).a $(RELEASEDIR)/* debug: setup $(addprefix $(DEBUGDIR)/,$(OBJECTS)) @$(AR) $(ARFLAGS) $(COMPONENT)-debug.a $(DEBUGDIR)/* test: debug $(TARGET_TESTS) coverage: clean @$(LCOV) --directory . --zerocounters @$(MAKE) test CFLAGS="$(CFLAGS) -fprofile-arcs -ftest-coverage" \ LDFLAGS="$(LDFLAGS) -lgcov" @$(LCOV) --directory $(DEBUGDIR) --base-directory $(TOP) \ --capture --output-file $(COVERAGEDIR)/$(COMPONENT)_tmp.info @$(LCOV) --extract $(COVERAGEDIR)/$(COMPONENT)_tmp.info "$(TOP)/src*" \ -o $(COVERAGEDIR)/$(COMPONENT).info @$(RM) $(RMFLAGS) $(COVERAGEDIR)/$(COMPONENT)_tmp.info @$(GENHTML) -o $(COVERAGEDIR) --num-spaces 2 \ $(COVERAGEDIR)/$(COMPONENT).info profile: clean @$(MAKE) test CFLAGS="$(CFLAGS) -pg" LDFLAGS="-pg $(LDFLAGS)" clean: -@$(RM) $(RMFLAGS) $(ITEMS_CLEAN) -@$(RM) $(RMFLAGS) gmon.out -@$(RM) $(RMFLAGS) -r $(COVERAGEDIR) -@$(RM) $(RMFLAGS) -r $(RELEASEDIR) -@$(RM) $(RMFLAGS) -r $(DEBUGDIR) -@$(RM) $(RMFLAGS) $(COMPONENT).a -@$(RM) $(RMFLAGS) $(COMPONENT)-debug.a -@$(RM) $(RMFLAGS) $(COMPONENT).pc distclean: clean -@$(RM) $(RMFLAGS) $(ITEMS_DISTCLEAN) -@$(RM) $(RMFLAGS) -r $(TOP)/dist setup: @$(MKDIR) $(MKDIRFLAGS) $(RELEASEDIR) @$(MKDIR) $(MKDIRFLAGS) $(DEBUGDIR) @$(MKDIR) $(MKDIRFLAGS) $(COVERAGEDIR) export: release @$(MKDIR) $(MKDIRFLAGS) $(TOP)/dist/lib @$(CP) $(CPFLAGS) -r include $(EXPORT)/ @${CP} ${CPFLAGS} $(COMPONENT).a ${EXPORT}/lib/ install: release @$(MKDIR) $(MKDIRFLAGS) -p $(PREFIX)/lib/pkgconfig @$(MKDIR) $(MKDIRFLAGS) -p $(PREFIX)/include/hubbub @$(SED) -e 's#PREFIX#$(PREFIX)#' $(COMPONENT).pc.in >$(COMPONENT).pc @$(INSTALL) --mode=644 -t $(PREFIX)/lib $(COMPONENT).a @$(INSTALL) --mode=644 -t $(PREFIX)/lib/pkgconfig $(COMPONENT).pc @$(INSTALL) --mode=644 -t $(PREFIX)/include/hubbub $(filter %.h, $(wildcard include/hubbub/*)) uninstall: @$(RM) $(RMFLAGS) $(PREFIX)/lib/$(COMPONENT).a @$(RM) $(RMFLAGS) $(PREFIX)/lib/pkgconfig/$(COMPONENT).pc @$(RM) $(RMFLAGS) -r $(PREFIX)/include/hubbub # Finally, build rules for compilation define do_compile $$(RELEASEDIR)/$(2): $(1) @$$(ECHO) $$(ECHOFLAGS) "==> $(1)" @$$(CC) -c $$(RELEASECFLAGS) -o $$@ $(1) $$(DEBUGDIR)/$(2): $(1) @$$(ECHO) $$(ECHOFLAGS) "==> $(1)" @$$(CC) -c $$(DEBUGCFLAGS) -o $$@ $(1) endef $(eval $(foreach SOURCE,$(filter %.c,$(SOURCES)), \ $(call do_compile,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)))))