在使用make
and的项目中bison
,我很难指定编译的语法grammar.tab.c
取决于语法 input 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)
如果我改变它:
OBJ=$(patsubst %.c, %.o, $(wildcard *.c)) grammar.tab.o
然后,如果它不存在,它将构建已编译的语法。但是如果它确实已经存在,那么在构建可执行文件时,就会出现关于yyparse
被提供两次的错误(大概是因为$OBJ
包含grammar.tab.o
两次)。
我的目标是一个Makefile:
- 将根据命令正确构建可执行
make
文件,并根据需要重新构建中间文件。 - 将拾取
*.c
目录中的所有文件(即添加新源文件时不需要更改)。 - 易于阅读和理解。
make
只要一次只有一两个,我不介意学习新功能。
其他人的语法构建 Makefile 是如何工作的?
编辑好的,这些都是很好的答案。我选择了过滤器,因为它是最小的变化。我真的很高兴每个人似乎都确切地知道我在说什么——我很担心被告知使用像 automake 这样的拜占庭式的东西 ;-)。
谢谢大家。