diff --git a/make/flex-bison.mk b/make/flex-bison.mk new file mode 100644 index 00000000..e09e489d --- /dev/null +++ b/make/flex-bison.mk @@ -0,0 +1,40 @@ +FB_EXE ?= $(notdir $(shell pwd)) +FB_NAME_PREFIX ?= $(shell pwd | xargs dirname | sed 's/-/_/g')_ +FB_SRC_Y ?= $(wildcard *.y) +FB_SRC_L ?= $(wildcard *.l) +FB_FLEX_PREFIX ?= $(FB_NAME_PREFIX) +FB_HDRDIR ?= . +FB_CFLAGS ?= -g -O0 +FB_CPPFLAGS ?= -std=c++11 +FB_FLEX_OUT_C = $(patsubst %.l,lex.%.c,$(FB_SRC_L)) +FB_BISON_OUT_C = $(patsubst %.y,%.tab.c,$(FB_SRC_Y)) +FB_GENERATED_C = $(FB_FLEX_OUT_C) $(FB_BISON_OUT_C) +FB_SRC_C = $(FB_GENERATED_C) $(filter-out $(FB_GENERATED_C),$(wildcard *.c) $(wildcard *.cpp)) +FB_OBJ = $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(FB_SRC_C))) + +.PRECIOUS: lex.%.c %.tab.c + +all: +install: +clean: clean.local +distclean: clean + +exe: $(FB_EXE) + +%.tab.c: %.y + bison --defines=$(patsubst %.tab.c,$(FB_HDRDIR)/%.tab.h,$@) --name-prefix=$(FB_NAME_PREFIX) -v -t $< -o $@ + +lex.%.c: %.l $(FB_BISON_OUT_C) + flex -i --header-file=$(FB_HDRDIR)/lex.$*.h --prefix=$(FB_FLEX_PREFIX) -o $@ $< + +%.o: %.c + gcc -D"FB_SYM(x)=$(FB_NAME_PREFIX)##x" $(FB_CFLAGS) -c $< + +%.o: %.cpp + gcc -D"FB_SYM(x)=$(FB_NAME_PREFIX)##x" $(FB_CFLAGS) $(FB_CPPFLAGS) -c $< + +$(FB_EXE): $(FB_OBJ) + g++ -g -o $(FB_EXE) $^ -lfl + +clean.local: + rm -f $(FB_GENERATED_C) $(FB_HDRDIR)/*.tab.h $(FB_HDRDIR)/lex.*.h *.output $(FB_EXE) *.tmp $(FB_OBJ) *.rep $(FB_HDRDIR)/*.rep