NAMESPACE_IN_GENERATED ?= $(FB_NAME) # These types are meant to be cut off the tree and turned into hand coded flex # regexes TRIM_SYMBOLS ?= CUT_SYMBOLS ?= IRRELEVANT_SYMBOLS ?= GENERATE_LOG_LEVEL ?= notice FIX_EXTENSIONS ?= discard CHECK_SYMBOLS ?= all ifneq ($(CHECK_SYMBOLS),) OPT_CHECK_SYMBOLS ?= --check-symbols='$(CHECK_SYMBOLS)' endif GENERATED_STD += $(FB_NAME).l $(FB_NAME).y $(FB_NAME).ebnf $(FB_COMMON_H) GENERATED += $(FB_NAME)-dense.ebnf $(GENERATED_STD) GRAMMAR_INPUT ?= $(FB_NAME)-input.ebnf FB_NAME_PREFIX ?= $(FB_NAME)_ FB_HDRDIR ?= include FB_BISON_OUT_EXT ?= cpp FB_FLEX_OUT_EXT ?= cpp FB_CASE_INSENSITIVE ?= true FB_SRC ?= $(filter %.y %.l,$(GENERATED)) FB_COMMON_H ?= $(FB_HDRDIR)/$(FB_NAME).h INCLUDED_BY_GENERATED += include/defs.h $(FB_COMMON_H) include/lex.$(FB_NAME).h include/$(FB_NAME).tab.h GENERATE_PY ?= ./generate.py GENERATE ?= python ./$(GENERATE_PY) --log-level $(GENERATE_LOG_LEVEL) create \ --fix-extensions $(FIX_EXTENSIONS) \ --unroll-lists \ --unroll-options \ --unroll-alternatives \ --replace-whitespace \ $(OPT_CHECK_SYMBOLS) \ --trim-symbols=$(shell echo $(TRIM_SYMBOLS) | sed 's/ */,/g') \ --cut-symbols=$(shell echo $(CUT_SYMBOLS) | sed 's/ */,/g') \ --irrelevant-symbols=$(shell echo $(IRRELEVANT_SYMBOLS) | sed 's/ */,/g') \ --namespace=$(NAMESPACE_IN_GENERATED) \ --includes=$(shell echo $(INCLUDED_BY_GENERATED) | sed 's/ */,/g') \ $(CREATE_EXTRA_ARGS) include $(TOPDIR)/make/proj.mk include $(MODDIR)/make/flex-bison.mk include $(MODDIR)/make/py-defs.mk all: debug-all: GENERATE_LOG_LEVEL=debug make all 2>&1 | tee run.out generate: $(GENERATED) #$(FB_NAME).y: $(FB_COMMON_H) lex.$(FB_NAME).$(FB_FLEX_OUT_EXT) #lex.$(FB_NAME).$(FB_FLEX_OUT_EXT): $(FB_NAME).l check: $(GRAMMAR_INPUT) $(GENERATE_PY) Makefile python ./$(GENERATE_PY) --log-level info check --fix-extensions unroll --unroll-lists --unroll-options $(OPT_CHECK_SYMBOLS) $< $(FB_NAME)-dense.ebnf: $(GRAMMAR_INPUT) $(GENERATE_PY) python ./$(GENERATE_PY) --log-level $(GENERATE_LOG_LEVEL) create --fix-extensions keep $< $(FB_NAME).ebnf > $@.tmp mv $@.tmp $@ define generate_rule $(1): $$(GRAMMAR_INPUT) $$(GENERATE_PY) Makefile $$(GENERATE) $$< $$(patsubst $(FB_NAME).%,$(FB_NAME).%,$$@) > $$@.tmp mv $$@.tmp $$@ endef $(foreach target,$(GENERATED_STD),$(eval $(call generate_rule,$(target)))) clean.generated: rm -f $(GENERATED) clean: clean.generated echo-generated: @echo GENERATED = $(GENERATED) help: $(GENERATE) --help expand-macros: make 2>/dev/null | sed '/g++/ !d; s/g++\|gcc//; s/-o .*//' | xargs g++ -E -C | indent