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:
make命令上正确构建可执行文件,根据需要重建中间文件.*.c获取目录中的所有文件(即添加新源文件时不需要更改).make功能,只要它一次只有一两个.别人的语法构建Makefiles如何运作?
编辑好的,这些都是很好的答案.我选择了滤出器,因为它是最小的变化.我很高兴每个人似乎都知道我正在谈论的内容 - 我很担心被告知使用类似于automake的东西;-).
感谢大家.
对于一般的'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)
您需要"排序"主要是为了自动删除重复项