依赖于目录下所有文件的Makefile规则(包括在子目录中)

Mec*_*ail 36 glob makefile wildcard gnu-make

我的Makefile中的一条规则将整个目录(res/)压缩为ZIP文件.显然,当目录下的任何文件res/发生更改时,需要执行此规则.因此,我希望规则将该目录下的所有文件作为先决条件.我该如何实施这条规则?

启用globstar选项的 Bash中,您可以使用通配符模式获取该目录中所有文件的列表res/**/*.但是,如果将其指定为Makefile中的先决条件,它似乎不起作用:

filename.jar: res/**/*
Run Code Online (Sandbox Code Playgroud)

即使在touch输入文件后res/,仍然可以生成报告

make: `filename.jar' is up to date.
Run Code Online (Sandbox Code Playgroud)

很明显它没有认识到这种模式.

如果我将目录本身声明为先决条件:

filename.jar: res
Run Code Online (Sandbox Code Playgroud)

然后在修改文件时不会重新执行Make(我认为make只查看目录本身的修改日期,只有在添加,删除或重命名直接子项时才会更改).

Bet*_*eta 52

这个:

filename.jar: $(wildcard res/**/*)
Run Code Online (Sandbox Code Playgroud)

似乎工作,至少在某些平台上.

编辑:

或者更好,只是切结:

filename.jar: $(shell find res -type f)
Run Code Online (Sandbox Code Playgroud)

  • @slowdog:当删除文件时,`res`目录的修改日期也将被更改.添加`res`目录本身的依赖性可以解决问题.只需从`find`命令中删除`-type f`即可. (10认同)
  • 警告:如果您在制作jar后删除*其中一个输入文件,make将不会注意到.为了能够检测文件删除,您可以将列表存储在一个文件中,类似于http://stackoverflow.com/questions/3236145/force-gnu-make-to-rebuild-objects-affected-by-compiler-definition/3237349#3237349 (5认同)
  • 允许空格`filename.jar:$(shell find res -type f | sed's// \\/g')`似乎对我有用 (5认同)
  • “通配符”建议对我不起作用,但“查找”确实有效。(我只使用了 `$(shell find res)` 以便在文件被删除时触发它。) (3认同)