依赖于目录下所有文件(包括子目录内)的 Makefile 规则
Posted
技术标签:
【中文标题】依赖于目录下所有文件(包括子目录内)的 Makefile 规则【英文标题】:Makefile rule that depends on all files under a directory (including within subdirectories) 【发布时间】:2012-12-26 16:55:24 【问题描述】:我的 Makefile 中的一条规则将整个目录 (res/
) 压缩到 ZIP 文件中。显然,当res/
目录下的any 文件发生变化时,需要执行此规则。因此,我希望规则将该目录下的所有文件作为先决条件。如何执行此规则?
在 Bash with the globstar
option enabled 中,您可以使用通配符模式 res/**/*
获取该目录中所有文件的列表。但是,如果您在 Makefile 中将其指定为先决条件,它似乎不起作用:
filename.jar: res/**/*
即使在touch
res/
中的文件之后,仍然会报告
make: `filename.jar' is up to date.
很明显它无法识别模式。
如果我将目录本身声明为先决条件:
filename.jar: res
然后当文件被修改时,Make 不会重新执行(我认为make
只查看目录本身的修改日期,只有在添加、删除或重命名直接子项时才会更改)。
【问题讨论】:
Makefile: depend on every file of a directory的可能重复 【参考方案1】:这个:
filename.jar: $(wildcard res/**/*)
似乎可以工作,至少在某些平台上是这样。
编辑:
或者更好,直接结束:
filename.jar: $(shell find res -type f)
【讨论】:
wildcard
的建议对我不起作用,但 find
确实有效。 (我只使用了$(shell find res)
,以便在文件被删除时触发它。)
警告:如果您在制作 jar 后删除其中一个输入文件,make 将不会注意到。为了能够检测文件删除,您可以将列表存储在一个文件中,类似于***.com/questions/3236145/…
@Beta:这个怎么样:开发者 A 从res
目录中删除他们认为未使用的文件,运行make
,测试 jar 文件,提交。开发人员 B 对代码进行了干净的检查,运行 make
,得到一个损坏的构建。
@slowdog:当文件被删除时,res
目录的修改日期也会随之改变。添加 res
目录本身的依赖可能会解决问题。只需从 find
命令中删除 -type f
。
允许空格 filename.jar: $(shell find res -type f | sed 's/ /\\ /g')
似乎对我有用以上是关于依赖于目录下所有文件(包括子目录内)的 Makefile 规则的主要内容,如果未能解决你的问题,请参考以下文章