# 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:%=%.png) %.png: %.dot dot -Tpng -o $@ $< %.dot: %.fsm $(DFAGEN_DEPS) $(DFAGEN) -o dot -d $< -p $(<:%.fsm=%)