makefile - Make 添加意外的 mv 命令

标签 makefile bison flex-lexer

我正在使用 makefile 来构建我的 flex/bison 项目。我遇到了问题,因为它添加了对 yacc 的调用和 mv 命令,从而覆盖了我的一个文件。

user@dk ~/calc ±master⚡ » make clean                                                                  
rm -rf lex.yy.c calc.tab.h calc.tab.c calc
user@dk ~/calc ±master » make
bison -d calc.y
flex calc.lex
g++ -o calc calc.tab.c lex.yy.c calc.c
user@dk ~/calc ±master⚡ » make clean
rm -rf lex.yy.c calc.tab.h calc.tab.c calc
user@dk ~/calc ±master » touch calc.y
user@dk ~/calc ±master » make
bison -d calc.y
flex calc.lex
yacc  calc.y
mv -f y.tab.c calc.c
g++ -o calc calc.tab.c lex.yy.c calc.c
... Failure ...

我将 makefile 简化到最低限度以重现这一点。使用 bison 创建两个文件:calc.tab.ccalc.tab.h。我没有 .h 文件作为目标,因为我不确定正确的方法是什么。对 bison 的调用将生成两个 calc.tab.* 文件,因此这不是我主要关心的问题。

构建此 makefile 以避免生成对 yacc 和 mv 的调用的正确方法是什么?

calc: calc.tab.c lex.yy.c calc.c
    g++ -o calc calc.tab.c lex.yy.c calc.c

calc.tab.c: calc.y
    bison -d calc.y

lex.yy.c: calc.lex calc.tab.h
    flex calc.lex

clean:
    rm -rf lex.yy.c calc.tab.h calc.tab.c calc

最佳答案

mv来自make的内置规则,其中包含:

%.c : %.y
    $(YACC.y) $<
    mv -f y.tab.c $@

看起来 make 正在尝试从 calc.y 创建 calc.c。对此的一些解决方案是您自己重新定义该规则,或者将 calc.y 重命名为不会触发 calc.c 的该规则,或者禁用 make 的内置规则。

您可以使用 make -p 列出所有内置规则。

关于makefile - Make 添加意外的 mv 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12362304/

相关文章:

package - Bison 最新版本已安装但未使用

c++ - 为什么 Flex/Lex 会将 C++ 代码的变量重置为其初始值?

c++ - 简单的数学解析器 Flex&Bison

debugging - 使看不到带有%标记的规则

linux - 如何修复错误 : bad value (native) for -march= switch and -mtune= switch?

c - 生成文件扩展名

antlr - 基于 yacc/bison/ANTLR 语法生成随机但仍然有效的表达式

c - 为什么这个 Bison 代码会产生意想不到的输出?

xcode - 如何在 Xcode 中抑制生成文件的编译器警告?

c - 如何从一个 makefile 构建多个目标