在Makefile中一次运行所有目标

son*_*s21 3 makefile gnu-make

我有一个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

Eta*_*ner 5

你想跑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.cparser.tab.c文件.

另请注意,先决条件是链接的,clean现在也可以清除二进制文件.您不需要以make clean这种方式运行以正确重建事物.