我正在尝试为我正在写的一个小的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?
答案 0 :(得分:0)
假冒目标不应成为真实目标文件的前提;如果 是的,每次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 $<