Lex、Yacc和C的简单Makefile

6
我正在尝试编译一个包含词法分析器文件、语法分析器文件和几个C文件的程序。我在Flex手册中看到了这个例子。关于这个makefile,我有几个问题。它没有指定像gcc这样的编译器,那么这个makefile如何知道如何创建目标文件,例如scan.oparse.omyprogram.o呢?
     # Makefile example -- scanner and parser.
     # Creates "myprogram" from "scan.l", "parse.y", and "myprogram.c"
     #
     LEX     = flex
     YACC    = bison -y
     YFLAGS  = -d
     objects = scan.o parse.o myprogram.o

     myprogram: $(objects)
     scan.o: scan.l parse.c
     parse.o: parse.y
     myprogram.o: myprogram.c

3
同一页上:“*以下Makefile并没有明示地告诉make如何从foo.l构建foo.c。相反,它依赖于make程序的隐式规则来构建中间文件scan.c:*”。不过,为那些.o添加明确的规则仍然是一个更好的主意。 - Kninnug
1个回答

5
这是一个Makefile的特性:存在一些隐式规则,并在https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html#Catalogue-of-Rules中有记录。
在您的情况下,相关部分如下:
编译C程序
使用形如“$(CC) $(CPPFLAGS) $(CFLAGS) -c”的命令行参数自动从n.c生成n.o。
[...]
C程序的Yacc
通过运行带有“$(YACC) $(YFLAGS)”命令行参数的Yacc自动生成n.c。
C程序的Lex
通过运行Lex自动生成n.c。实际的命令行参数为“$(LEX) $(LFLAGS)”。
根据https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_12.html,其中一些规则不可移植...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接