2013-01-12 115 views
20

我的Makefile中的一条规则将整个目录(res/)压缩成ZIP文件。很显然,这个规则需要在res/目录下的任何文件更改时执行。因此,我希望规则具有该目录下所有文件的先决条件。我怎样才能实现这个规则?Makefile规则依赖于目录下的所有文件(包括子目录下)

在Bash with the globstar option enabled中,您可以使用通配符res/**/*获得该目录中所有文件的列表。然而,这似乎并没有,如果你将它指定为在Makefile的前提工作:

即使在 touch
filename.jar: res/**/* 

荷兰国际集团在res/文件,使报告仍然

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

所以显然这是不认识模式。

如果我宣布了目录本身作为一个先决条件:

filename.jar: res 

然后让不会重新执行,当一个文件被修改(我认为make只着眼于目录本身,修改日期只当直接的孩子被添加,移除或重命名时改变)。

+0

的可能重复[Makefile文件:取决于目录的所有文件(http://stackoverflow.com/questions/5656913/makefile-depends-on-every-file-of-a-directory) –

回答

29

此:

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

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

编辑:

或者更好的,刚切结:

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

'wildcard'建议不适用于我,但'find'确实可行。 (我只用'$(shell find res)'来触发它,当文件被删除时也是如此。) –

+3

注意:如果你在删除*之后删除了一个输入文件,make不会注意到。为了能够检测文件删除,可以将列表存储在一个文件中,类似于http://stackoverflow.com/questions/3236145/force-gnu-make-to-rebuild-objects-affected-by-compiler-definition/3237349#3237349 – slowdog

+0

@slowdog:是的,但为此目的(ZIP存档)我不认为这很重要。 – Beta

相关问题