X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=Makefile;h=d53e89f4d1ca9556e64187e4d3a1a63272b64c74;hp=b60874d787d7522c8da54df581946b02d8b6a3d4;hb=HEAD;hpb=650c775ff00cccd03fc84e7789a03c51d9839004;ds=sidebyside diff --git a/Makefile b/Makefile index b60874d7..875e99f2 100644 --- a/Makefile +++ b/Makefile @@ -1,28 +1,100 @@ -# Hacky makefile to compile everything and run the tests in some kind of sane order. -# V=--verbose for verbose tests. +# Makefile for CCAN -CFLAGS=-O3 -Wall -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Werror -Iccan -I. +# 'make quiet=1' builds silently +QUIETEN.1 := @ +PRE := $(QUIETEN.$(quiet)) -ALL=$(patsubst ccan/%/test, ccan/%, $(wildcard ccan/*/test)) -ALL_DEPENDS=$(patsubst %, %/.depends, $(ALL)) +all:: -test-all: $(ALL_DEPENDS) - $(MAKE) `for f in $(ALL); do echo test-$$f test-$$f; while read d; do echo test-$$d test-$$f; done < $$f/.depends; done | tsort` +# Our flags for building +WARN_CFLAGS := -Wall -Wstrict-prototypes -Wold-style-definition -Wundef \ + -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wwrite-strings -Wshadow=local +DEP_CFLAGS = -MMD -MP -MF$(@:%=%.d) -MT$@ +CCAN_CFLAGS := -g3 -ggdb $(WARN_CFLAGS) -DCCAN_STR_DEBUG=1 -I. $(CFLAGS) +CFLAGS_FORCE_C_SOURCE := -x c -distclean: clean - rm -f */_info - rm -f $(ALL_DEPENDS) +# Anything with an _info file is a module ... +INFO_SRCS := $(wildcard ccan/*/_info ccan/*/*/_info) +ALL_INFOS := $(INFO_SRCS:%_info=%info) +ALL_MODULES := $(ALL_INFOS:%/info=%) -$(ALL_DEPENDS): %/.depends: %/_info - @$< depends > $@ || ( rm -f $@; exit 1 ) +# ... Except stuff that needs external dependencies, which we exclude +EXCLUDE := altstack jmap jset nfs ogg_to_pcm tal/talloc wwviaudio +MODULES:= $(filter-out $(EXCLUDE:%=ccan/%), $(ALL_MODULES)) -test-ccan/%: tools/run_tests - @echo Testing $*... - @if tools/run_tests $(V) ccan/$* | grep ^'not ok'; then exit 1; else exit 0; fi +# Sources are C files in each module, objects the resulting .o files +SRCS := $(wildcard $(MODULES:%=%/*.c)) +OBJS := $(SRCS:%.c=%.o) +DEPS := $(OBJS:%=%.d) -ccanlint: tools/ccanlint/ccanlint +# We build all object files using our CCAN_CFLAGS, after config.h +%.o : %.c config.h + $(PRE)$(CC) $(CCAN_CFLAGS) $(DEP_CFLAGS) -c $< -o $@ -clean: tools-clean - rm -f `find . -name '*.o'` `find . -name '.depends'` +# _info files are compiled into executables and don't need dependencies +%info : %_info config.h + $(PRE)$(CC) $(CCAN_CFLAGS) -I. -o $@ $(CFLAGS_FORCE_C_SOURCE) $< -include tools/Makefile +# config.h is built by configurator which has no ccan dependencies +CONFIGURATOR := tools/configurator/configurator +$(CONFIGURATOR): $(CONFIGURATOR).c + $(PRE)$(CC) $(CCAN_CFLAGS) $(DEP_CFLAGS) $< -o $@ +config.h: $(CONFIGURATOR) Makefile + $(PRE)$(CONFIGURATOR) $(CC) $(CCAN_CFLAGS) >$@.tmp && mv $@.tmp $@ + +# Tools +TOOLS := tools/ccan_depends tools/doc_extract tools/namespacize tools/modfiles +TOOLS_SRCS := $(filter-out $(TOOLS:%=%.c), $(wildcard tools/*.c)) +TOOLS_DEPS := $(TOOLS_SRCS:%.c=%.d) $(TOOLS:%=%.d) +TOOLS_CCAN_MODULES := asort err foreach hash htable list membuf noerr opt rbuf \ + read_write_all str take tal tal/grab_file tal/link tal/path tal/str time +TOOLS_CCAN_SRCS := $(wildcard $(TOOLS_CCAN_MODULES:%=ccan/%/*.c)) +TOOLS_OBJS := $(TOOLS_SRCS:%.c=%.o) $(TOOLS_CCAN_SRCS:%.c=%.o) +tools/% : tools/%.c $(TOOLS_OBJS) + $(PRE)$(CC) $(CCAN_CFLAGS) $(DEP_CFLAGS) $< $(TOOLS_OBJS) -lm -o $@ + +# ccanlint +LINT := tools/ccanlint/ccanlint +LINT_OPTS.ok := -s +LINT_OPTS.fast-ok := -s -x tests_pass_valgrind -x tests_compile_coverage +LINT_SRCS := $(filter-out $(LINT).c, $(wildcard tools/ccanlint/*.c tools/ccanlint/tests/*.c)) +LINT_DEPS := $(LINT_SRCS:%.c=%.d) $(LINT).d +LINT_CCAN_MODULES := autodata dgraph ilog lbalance ptr_valid strmap +LINT_CCAN_SRCS := $(wildcard $(LINT_CCAN_MODULES:%=ccan/%/*.c)) +LINT_OBJS := $(LINT_SRCS:%.c=%.o) $(LINT_CCAN_SRCS:%.c=%.o) $(TOOLS_OBJS) +ifneq ($(GCOV),) +LINT_GCOV = --gcov="$(GCOV)" +endif +$(LINT): $(LINT).c $(LINT_OBJS) + $(PRE)$(CC) $(CCAN_CFLAGS) $(DEP_CFLAGS) $(LINT).c $(LINT_OBJS) -lm -o $@ + +# We generate dependencies for tests into a .d file +%/.d: %/info tools/gen_deps.sh tools/ccan_depends + $(PRE)tools/gen_deps.sh $* > $@ || rm -f $@ +TEST_DEPS := $(MODULES:%=%/.d) + +# We produce .ok files when the tests succeed +%.ok: $(LINT) %info + $(PRE)$(LINT) $(LINT_OPTS.ok) --deps-fail-ignore $(LINT_GCOV) $(LINTFLAGS) $(dir $*) && touch $@ + +%.fast-ok: $(LINT) %info + $(PRE)$(LINT) $(LINT_OPTS.fast-ok) --deps-fail-ignore $(LINT_GCOV) $(LINTFLAGS) $(dir $*) && touch $@ + +check: $(MODULES:%=%/.ok) +fastcheck: $(MODULES:%=%/.fast-ok) + +ifeq ($(strip $(filter clean config.h, $(MAKECMDGOALS))),) +-include $(DEPS) $(LINT_DEPS) $(TOOLS_DEPS) $(TEST_DEPS) +endif + +# Default target: object files, info files and tools +all:: $(OBJS) $(ALL_INFOS) $(CONFIGURATOR) $(LINT) $(TOOLS) + +.PHONY: clean TAGS +clean: + $(PRE)find . -name "*.d" -o -name "*.o" -o -name "*.ok" | xargs -n 256 rm -f + $(PRE)rm -f $(CONFIGURATOR) $(LINT) $(TOOLS) TAGS config.h config.h.d $(ALL_INFOS) + +# 'make TAGS' builds etags +TAGS: + $(PRE)find * -name '*.[ch]' | xargs etags