使用make生成bison语法

Edm*_*und 2 makefile compilation bison

在使用make和的项目中bison,我很难指定编译的语法grammar.tab.c依赖于语法输入grammar.y,每个目标文件依赖于相应的源文件(包括grammar.tab.o),并且可执行文件依赖于所有目标文件.

问题是make当grammar.tab.c尚不存在时运行意味着没有尝试构建它,并且当构建可执行文件时,该yyparse函数丢失.

Makefile是:

CFLAGS = -g -Wall
YACC = bison -d -r all
OBJ=$(patsubst %.c, %.o, $(wildcard *.c))
HEADERS=grammar.tab.h hex.h compiler.h types.h

all: grammar.tab.h c

clean:
    rm -f $(OBJ) *.tab.c *.tab.h c c.exe *.output

c: $(OBJ)
    $(CC) -o $@ $(OBJ) $(CFLAGS)

grammar.tab.c: grammar.y
    $(YACC) grammar.y

grammar.tab.h: grammar.y
    $(YACC) grammar.y

%.o: %.c $(HEADERS)
    $(CC) -c $< $(CFLAGS)
Run Code Online (Sandbox Code Playgroud)

如果我改变它:

OBJ=$(patsubst %.c, %.o, $(wildcard *.c)) grammar.tab.o
Run Code Online (Sandbox Code Playgroud)

然后它将构建已编译的语法(如果它尚不存在).但是如果它已经存在,那么在构建可执行文件时,会出现yyparse两次提供错误(可能是因为$OBJ包含grammar.tab.o两次).

我的目标是Makefile:

  1. 将在make命令上正确构建可执行文件,根据需要重建中间文件.
  2. *.c获取目录中的所有文件(即添加新源文件时不需要更改).
  3. 易于阅读和理解.我不介意学习新make功能,只要它一次只有一两个.

别人的语法构建Makefiles如何运作?

编辑好的,这些都是很好的答案.我选择了滤出器,因为它是最小的变化.我很高兴每个人似乎都知道我正在谈论的内容 - 我很担心被告知使用类似于automake的东西;-).

感谢大家.

Chr*_*odd 5

对于一般的'run yacc'规则,你需要类似的东西

%.tab.c: %.y
        $(YACC) $<

%.tab.h: %.tab.c
        @touch $@
Run Code Online (Sandbox Code Playgroud)

获得您想要的所有来源

OBJ=$(sort $(patsubst %.c, %.o, $(wildcard *.c)) $(patsubst %.y, %.tab.o, $(wildcard *.y)))
Run Code Online (Sandbox Code Playgroud)

您需要"排序"主要是为了自动删除重复项