我有一个Makefile如下
all:
bison -d -v parser.y
flex -o parser.lex.c parser.lex
gcc -o cparser parser.lex.c parser.tab.c -lfl -lm
clean:
rm parser.tab.h parser.tab.c parser.output parser.lex.c
Run Code Online (Sandbox Code Playgroud)
当我在终端中运行make时它只运行目标all
.
我已尝试添加
.PHONY:all clean
,.PHONY:clean
即使它只运行all
.我应该在Makefile中进行哪些更改,以便它运行所有目标?
系统配置:
Ubuntu 14.10
GNU Make 4.0
你想跑all
,clean
什么时候输入make
?这通常没有用,因为那会清理你刚才构建的东西(虽然在你的情况下我看到你的clean
目标实际上并没有这样做).
要做到这一点你想要的东西.
all: cparser clean
cparser:
bison -d -v parser.y
flex -o parser.lex.c parser.lex
gcc -o cparser parser.lex.c parser.tab.c -lfl -lm
clean:
rm parser.tab.h parser.tab.c parser.output parser.lex.c
Run Code Online (Sandbox Code Playgroud)
虽然这仍然是一个相当差的makefile,并没有利用为您提供的任何好处make
(例如只有在他们的先决条件发生变化时智能地重建事物).
我建议你可能想要更像这样的东西.
.PHONY: all
all: cparser
parser.lex: parser.y
bison -d -v parser.y
parser.lex.% parser.tab.%: parser.lex
flex -o parser.lex.c parser.lex
cparser: parser.lex.c parser.tab.c
gcc -o cparser parser.lex.c parser.tab.c -lfl -lm
.PHONY: clean
clean:
rm parser.tab.h parser.tab.c parser.output parser.lex.c cparser
Run Code Online (Sandbox Code Playgroud)
假设我没记错,那flex
将同时生成parser.lex.c
和parser.tab.c
文件.
另请注意,先决条件是链接的,clean
现在也可以清除二进制文件.您不需要以make clean
这种方式运行以正确重建事物.