gpt4 book ai didi

makefile - 使用 make 生成 bison 文法

转载 作者:行者123 更新时间:2023-12-02 07:54:30 27 4
gpt4 key购买 nike

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

问题是当 grammar.tab.c 还不存在时运行 make 意味着没有尝试构建它,而当构建可执行文件时 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:

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

其他人的语法构建 Makefile 是如何工作的?

编辑 好的,这些都是很好的答案。我选择了过滤掉的,因为它是最小的变化。我真的很高兴每个人似乎都确切地知道我在说什么——我很担心被告知要使用像 automake 这样拜占庭式的东西 ;-)。

谢谢大家

最佳答案

对于一般的“运行 yacc”规则,您需要类似的东西

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

%.tab.h: %.tab.c
@touch $@

获取所有你想要的资源

OBJ=$(sort $(patsubst %.c, %.o, $(wildcard *.c)) $(patsubst %.y, %.tab.o, $(wildcard *.y)))

您主要需要“排序”来自动删除重复项

关于makefile - 使用 make 生成 bison 文法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1691696/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com