limp_chimp
limp_chimp

Reputation: 15213

make recompiles everything every time, why?

Here's my 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 insertintotest.sql
    @./parsesql.sh deletefromtest.sql
    @./parsesql.sh createtest.sql

cleanup:
    rm test.tab.cacc
    rm y.output

Running make will always trigger a full recompile, even if nothing has changed:

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

None of the files have changed, so why is it doing this? The lex and yacc commands should only trigger if sql.l or sql.y respectively have changed, no?

Upvotes: 2

Views: 414

Answers (1)

Carl Norum
Carl Norum

Reputation: 225192

Your targets are all not real files. Make them the names of the actual files you're generating so that make can find them and check timestamps.

Example:

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

You can add .PHONY: all test cleanup to indicate to make that those targets are not intended to be real files.

Upvotes: 2

Related Questions