From b0c2503c9a9d11c119d8f551a76381c6038e253b Mon Sep 17 00:00:00 2001 From: Jérémy Dufour Date: Sat, 14 Mar 2009 23:23:44 +0100 Subject: * digital/io/src, digital/avr/make - move FSM build rules to a specific Makefile, - use a variable to define the list of FSMs to build. --- digital/avr/make/Makefile.fsm | 100 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 digital/avr/make/Makefile.fsm (limited to 'digital/avr/make') diff --git a/digital/avr/make/Makefile.fsm b/digital/avr/make/Makefile.fsm new file mode 100644 index 00000000..38735b03 --- /dev/null +++ b/digital/avr/make/Makefile.fsm @@ -0,0 +1,100 @@ +# Makefile.fsm - Makefile to build FSM. + +# You need to define: +# - FSM_SOURCES with the name of each of your FSM. For example, if you have +# a example.fsm and check.fsm, you need to set FSM_SOURCES to "example +# check". + +# FSM build: +# +# The %_cb.c file can not be auto-generated. When the %_cb_skel.c is changed, +# user should check if they still are synchronised using a merge program, like +# vimdiff. +# +# To help user, the user can define the CB variable to request a particular +# behaviour. +# +# If CB=touch, ignore the auto-generation and touch the %_cb.c file. +# +# If CB=vimdiff, use vimdiff to merge differences. +# +# If CB=merge, try to merge automatically. In this case, it uses a old copy +# of %_cb_skel.c to merge. This will fail the first time if no old copy is +# available. + +# If templates are modified, files should be rebuilt. +FSM_TEMPLATES := template_cb.h template_cb_decl.h template_cb_impl.c \ + template_cb_skel.c template_fsm.c template_fsm.h +FSM_TEMPLATES := $(FSM_TEMPLATES:%=fsm_templates/%) + +# Theses files are auto-generated, remove them on clean. +EXTRA_CLEAN_FILES += $(FSM_SOURCES:%=%_fsm.h) +EXTRA_CLEAN_FILES += $(FSM_SOURCES:%=%_fsm.c) +EXTRA_CLEAN_FILES += $(FSM_SOURCES:%=%_cb.h) +EXTRA_CLEAN_FILES += $(FSM_SOURCES:%=%_cb_skel.c) +EXTRA_CLEAN_FILES += $(FSM_SOURCES:%=%.png) + +DFAGEN_DIR := $(BASE)/../../tools/dfagen +DFAGEN_DEPS := $(DFAGEN_DIR)/dfagen.py +DFAGEN := python $(DFAGEN_DIR)/dfagen.py + +# Add source to build. +$(PROGS)_SOURCES += $(FSM_SOURCES:%=%.c) +$(PROGS)_SOURCES += $(FSM_SOURCES:%=%_fsm.c) +$(PROGS)_SOURCES += $(FSM_SOURCES:%=%_cb.c) +$(PROGS)_SOURCES += fsm.c + +# Include general Makefile for first rule to be default. +include $(BASE)/make/Makefile.gen + +# Bootstrap, fsm should be generated before fsm.h is used. +fsm.c: fsm.h +main.c: fsm.h +fsm.h: $(FSM_SOURCES:%=%_fsm.h) + +$(DFAGEN_DIR)/dfagen.py: $(DFAGEN_DIR)/dfagen/parser.py +$(DFAGEN_DIR)/dfagen/parser.py: $(DFAGEN_DIR)/dfagen/parser.g + yapps $< + +%_fsm.h %_fsm.c %_cb.h %_cb_skel.c: %.fsm fsm.conf $(FSM_TEMPLATES) \ + $(DFAGEN_DEPS) + $(DFAGEN) -o c -d $< -c fsm.conf -p $(<:%.fsm=%) + +.PRECIOUS: $(FSM_SOURCES:%=%_cb.c) + +ifndef CB +%_cb.c: %_cb_skel.c + @echo "Please update $@" + @false +else ifeq ($(CB),touch) +%_cb.c: %_cb_skel.c + @echo "Updating $@ blindly" + cp $< .$<.old + touch $@ +else ifeq ($(CB),merge) +%_cb.c: %_cb_skel.c + @echo "Try to merge $@..." + @if [ -r .$<.old ]; then \ + merge $@ .$<.old $<; \ + RET=$$?; \ + else \ + echo "No history, cannot merge"; \ + RET=1; \ + fi; \ + cp $< .$<.old; \ + exit $$RET +else +%_cb.c: %_cb_skel.c + @echo "Using $(CB) to update $@" + cp $< .$<.old + $(CB) $@ $< +endif + + +png: $(FSM_SOURCES:%=%_cb.h) + +%.png: %.dot + dot -Tpng -o $@ $< + +%.dot: %.fsm $(DFAGEN_DEPS) + $(DFAGEN) -o dot -d $< -p $(<:%.fsm=%) -- cgit v1.2.3