I’m pretty new to make so maybe the following is trivial and/or horribly bad practice, but here goes: I have this bunch of output directories, each containing a file called en.tok
from which I want to make a corrected version, en.tok.corr
. Apart from en.tok
, en.tok.corr
also depends on the script that applies the corrections, and on a MySQL database that contains the corrections. Since make doesn’t know about databases, I chose to represent the database by an empty file en.tok.db
and use touch
in a second rule to set its timestamp to that of the latest relevant correction so make knows whether to rerun the first rule:
$(OUT)%/en.tok.corr : $(OUT)%/en.tok $(OUT)%/en.tok.db ${PYTHON}/correct_tokenization.py ${PYTHON}/correct_tokenization.py $> $@ $(OUT)%/en.tok.db : touch -t $$(${PYTHON}/latest_correction.py $@) $@
But how can I force make to apply that second rule every time? We need to know if there are new corrections in the database, after all. My first idea was to declare the target $(OUT)%/en.tok.db
phony by making it a prerequisite of the special target .PHONY
, but that doesn’t work since the %
wildcard is apparently only interpreted in rules whose target contains it. Thanks to this post by James T. Kim, I found a solution: instead of declaring $(OUT)%/en.tok.db
phony itself, just make it depend on an explicit phony dummy target:
$(OUT)%/en.tok.db : dummy touch -t $$(${PYTHON}/latest_correction.py $@) $@ .PHONY : dummy