依赖于目录下所有文件(包括子目录内)的 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/**/*

即使在touchres/ 中的文件之后,仍然会报告

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 规则的主要内容,如果未能解决你的问题,请参考以下文章

批处理删除当前文件夹下所有指定类型文件(包括子目录)

Makefile 多目录自动编译

Linux查看当前目录下文件夹和文件的大小

日更第23日: 容器安全之为docker挂载单独数据目录

linux下如何用unzip解压目录内所有zip文件?

php列出目录下所有文件(包括子目录)