2

これが私のメイクファイルです:

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

どのファイルも変更されていないのに、なぜこれを行っているのでしょうか? lexおよびコマンドは、またはそれぞれが変更されたyacc場合にのみトリガーする必要があります。sql.lsql.y

4

1 に答える 1

2

ターゲットはすべて実際のファイルではありません。それらを生成している実際のファイルの名前にして、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

于 2013-06-27T22:58:19.003 に答える