Makefile 每次都要重新编译,为什么?
这是我的makefile:Makefile 每次都要重新编译,为什么?,makefile,Makefile,这是我的makefile: all: lex yacc compile lex: sql.l lex -i sql.l yacc: sql.y yacc -d -v sql.y compile: y.tab.c lex.yy.c $(CC) -o sql_parser y.tab.c lex.yy.c -ly -ll test: all @./parsesql.sh selecttest.sql @./parsesql.sh insertintot
all: lex yacc compile
lex: sql.l
lex -i sql.l
yacc: sql.y
yacc -d -v sql.y
compile: y.tab.c lex.yy.c
$(CC) -o sql_parser y.tab.c lex.yy.c -ly -ll
test: all
@./parsesql.sh selecttest.sql
@./parsesql.sh insertintotest.sql
@./parsesql.sh deletefromtest.sql
@./parsesql.sh createtest.sql
cleanup:
rm test.tab.cacc
rm y.output
运行make
将始终触发完全重新编译,即使没有任何更改:
parsesql> make
lex -i sql.l
yacc -d -v sql.y
cc -o sql_parser y.tab.c lex.yy.c -ly -ll
parsesql> make
lex -i sql.l
yacc -d -v sql.y
cc -o sql_parser y.tab.c lex.yy.c -ly -ll
parsesql> make
lex -i sql.l
yacc -d -v sql.y
cc -o sql_parser y.tab.c lex.yy.c -ly -ll
所有文件都没有更改,为什么要这样做?只有当分别更改了
sql.l
或sql.y
时,才应触发lex
和yacc
命令,否?您的目标都不是真实的文件。使它们成为您正在生成的实际文件的名称,以便Make
可以找到它们并检查时间戳
例如:
all: sql_parser
lex.yy.c: sql.l
lex -i sql.l
y.tab.c: sql.y
yacc -d -v sql.y
sql_parser: y.tab.c lex.yy.c
$(CC) -o sql_parser y.tab.c lex.yy.c -ly -ll
test: all
@./parsesql.sh selecttest.sql
@./parsesql.sh insertintotest.sql
@./parsesql.sh deletefromtest.sql
@./parsesql.sh createtest.sql
cleanup:
rm test.tab.cacc
rm y.output
您可以添加.PHONY:all-test-cleanup
,以指示make
这些目标不是真正的文件