Reputation: 15213
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
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