# Top-level Makefile fragment # Default target all: release # Name of component COMPONENT := libcss # 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 configuration Makefile fragment include build/Makefile.config # 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 $(addprefix $(RELEASEDIR)/,$(OBJECTS)) debug: setup $(addprefix $(DEBUGDIR)/,$(OBJECTS)) @$(AR) $(ARFLAGS) $(COMPONENT)-debug.a \ $(addprefix $(DEBUGDIR)/,$(OBJECTS)) 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)/deps @$(MKDIR) $(MKDIRFLAGS) $(DEBUGDIR)/deps @$(MKDIR) $(MKDIRFLAGS) $(COVERAGEDIR) export: @$(MKDIR) $(MKDIRFLAGS) -p $(TOP)/dist @$(MAKE) install PREFIX="$(TOP)/dist" install: release @$(MKDIR) $(MKDIRFLAGS) -p $(DESTDIR)$(PREFIX)/lib/pkgconfig @$(MKDIR) $(MKDIRFLAGS) -p $(DESTDIR)$(PREFIX)/include/libcss @$(SED) -e 's#PREFIX#$(PREFIX)#' $(COMPONENT).pc.in >$(COMPONENT).pc $(INSTALL) -m 644 $(COMPONENT).a $(DESTDIR)$(PREFIX)/lib $(INSTALL) -m 644 $(COMPONENT).pc $(DESTDIR)$(PREFIX)/lib/pkgconfig $(INSTALL) -m 644 $(filter %.h, $(wildcard include/libcss/*)) $(DESTDIR)$(PREFIX)/include/libcss uninstall: $(RM) $(RMFLAGS) $(DESTDIR)$(PREFIX)/lib/$(COMPONENT).a $(RM) $(RMFLAGS) $(DESTDIR)$(PREFIX)/lib/pkgconfig/$(COMPONENT).pc $(RM) $(RMFLAGS) -r $(DESTDIR)$(PREFIX)/include/libcss $(RELEASEDIR)/deps/created: @$(MKDIR) $(MKDIRFLAGS) $(RELEASEDIR)/deps @$(TOUCH) $(TOUCHFLAGS) $(RELEASEDIR)/deps/created $(DEBUGDIR)/deps/created: @$(MKDIR) $(MKDIRFLAGS) $(DEBUGDIR)/deps @$(TOUCH) $(TOUCHFLAGS) $(DEBUGDIR)/deps/created DEPFILES := define do_dep DEPFILES += $(2) $$(RELEASEDIR)/deps/$(2): $$(RELEASEDIR)/deps/created $(1) @$$(ECHO) $$(ECHOFLAGS) "DEP $(1)" @$$(RM) $$(RMFLAGS) $$(RELEASEDIR)/deps/$(2) @$$(CC) $$(RELEASECFLAGS) -MM -MT \ '$$(RELEASEDIR)/deps/$(2) $$(RELEASEDIR)/$(3)' \ -MF $$(RELEASEDIR)/deps/$(2) $(1) $$(DEBUGDIR)/deps/$(2): $$(DEBUGDIR)/deps/created $(1) @$$(ECHO) $$(ECHOFLAGS) "DEP $(1)" @$$(RM) $$(RMFLAGS) $$(DEBUGDIR)/deps/$(2) @$$(CC) $$(DEBUGCFLAGS) -MM -MT \ '$$(DEBUGDIR)/deps/$(2) $$(DEBUGDIR)/$(3)' \ -MF $$(DEBUGDIR)/deps/$(2) $(1) endef # 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_dep,$(SOURCE),$(subst /,_,$(SOURCE:.c=.d)),$(subst /,_,$(SOURCE:.c=.o))))) ifneq ($(findstring clean,$(MAKECMDGOALS)),clean) -include $(sort $(addprefix $(RELEASEDIR)/deps/,$(DEPFILES))) -include $(sort $(addprefix $(DEBUGDIR)/deps/,$(DEPFILES))) endif $(eval $(foreach SOURCE,$(filter %.c,$(SOURCES)), \ $(call do_compile,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)))))