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

MakefileWildcardGnu MakeGlob

Makefile Problem Overview


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).

Makefile Solutions


Solution 1 - Makefile

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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMechanical snailView Question on Stackoverflow
Solution 1 - MakefileBetaView Answer on Stackoverflow