Makefile rule that depends on all files under a directory (including within subdirectories)

Mechanical snail picture Mechanical snail · Jan 12, 2013 · Viewed 23.2k times · Source

One rule in my Makefile zips an entire directory (res/) into a ZIP file. Obviously, this rule needs to execute when any file under the res/ directory changes. Thus, I want the rule to have as a prerequisite all files underneath that directory. How can I implement this rule?

In Bash with the globstar option enabled, you can obtain a list of all the files in that directory using the wildcard pattern res/**/*. However, it doesn't seem to work if you specify it as a prerequisite in the Makefile:

filename.jar: res/**/*

Even after touching a file in res/, Make still reports

make: `filename.jar' is up to date.

so clearly it is not recognizing the pattern.

If I declare the directory itself as a prerequisite:

filename.jar: res

then Make will not re-execute when a file is modified (I think make only looks at the modified date of the directory itself, which only changes when immediate children are added, removed, or renamed).

Answer

Beta picture Beta · Jan 12, 2013

This:

filename.jar: $(wildcard res/**/*)

seems to work, at least on some platforms.

EDIT:

Or better, just cut the knot:

filename.jar: $(shell find res -type f)