即使没有任何更改,Makefiles也会编译文件

时间:2019-04-20 08:17:28

标签: makefile

我正在尝试为我正在写的一个小的shell创建一个makefile。 这些文件是:

myShell.c
myShellFunc.c
parser.y
shel.l

makefile:

CC = gcc
CFLAGS= -g -Wall


myshell: myShell.o myShellFunc.o parser.tab.o lex.yy.o
    $(CC) $(CFLAGS) myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

myShell.o: myShell.c myShell.h parser.tab.h
myShellFunc.o: myShellFunc.c myShell.h

parser.tab.c: bisonfiles
parser.tab.h: bisonfiles
lex.yy.c: shell.l
    flex shell.l

.PHONY: bisonfiles
bisonfiles: parser.y
    bison -d parser.y

问题在于,即使文件没有变化,它仍然会编译它们。

当我第一次运行make时,我得到了:

bison -d parser.y
gcc -g -Wall   -c -o myShell.o myShell.c
gcc -g -Wall   -c -o parser.tab.o parser.tab.c
flex shell.l
gcc -g -Wall   -c -o lex.yy.o lex.yy.c
gcc -g -Wall myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

我第二次运行它,而没有进行任何更改:

bison -d parser.y
gcc -g -Wall   -c -o parser.tab.o parser.tab.c
gcc -g -Wall myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

我第三次在不做任何更改的情况下运行它:

bison -d parser.y
gcc -g -Wall   -c -o myShell.o myShell.c
gcc -g -Wall   -c -o parser.tab.o parser.tab.c
gcc -g -Wall myShell.o myShellFunc.o parser.tab.o lex.yy.o -lfl -o myshell

为什么我没有进行任何更改,为什么会发生这种情况?
如何正确编写makefile?

1 个答案:

答案 0 :(得分:0)

GNU make documentation ...

  

假冒目标不应成为真实目标文件的前提;如果   是的,每次make更新时都会运行其配方   文件。

但是你有...

parser.tab.c: bisonfiles
parser.tab.h: bisonfiles
lex.yy.c: shell.l
        flex shell.l

.PHONY: bisonfiles
bisonfiles: parser.y
        bison -d parser.y

这里bisonfiles被声明为.PHONY目标,因此,您看到bison -d parser.y每次make调用都在运行。

最简单的解决方案可能是完全摆脱bisonfiles目标,而仅使用模式规则...

%.tab.c %.tab.h: %.y
        bison -d $<