Makefile规则取决于文件数量/标题的更改,而不是文件内容的更改

use*_*925 3 makefile

我正在使用makefile来自动生成一些文档.我在一个目录中有几个文件,我的一个makefile规则将生成这些文件的索引页面.文件列表本身是使用动态加载的,list := $(shell ls documents/*.txt)所以每次添加,删除或重命名文档时,我都不必费心手动编辑makefile.当然,我希望索引生成规则在文档目录中的文件的数量/标题发生变化时触发,但我不知道如何设置先决条件以这种方式工作.

我可以使用.PHONY或类似的东西强制索引生成一直运行,但我宁愿不浪费周期.我试过管道ls到一个文件list.txt并使用作为我的索引生成规则的先决条件,但这需要list.txt手动编辑(试图避免它),或者在makefile中自动生成它(这会改变创建时间,所以我不能list.txt在先决条件中使用,因为它每次都会触发规则).

P S*_*ved 6

如果您需要依赖于文件数量,那么...为什么不仅仅依赖于数字本身?该数字将表示为当指定的文件的nubmer在documents目录中时创建的虚拟文件.

NUMBER=$(shell ls documents/*.txt | wc -l).files
# This yields name like 2.files, 3.files, etc...
# .PHONY $(NUMBER) -- NOT a phony target!

$(NUMBER):
        rm *.files    # Remove previous trigger
        touch $(NUMBER)

index.txt: $(NUMBER)
        ...generate index.txt...
Run Code Online (Sandbox Code Playgroud)

虽然文件数是一个要跟踪的属性,但您可能依赖于目录列表的哈希值.对于工作流程中出现的两个列表,哈希函数不太可能相同.这是一个例子:

NUMBER=$(shell ls -l documents/*.txt | md5sum | sed 's/[[:space:]].*//').files
Run Code Online (Sandbox Code Playgroud)

注意使用-l- 这样您将依赖于完整的文件列表,其中包括修改时间,大小和文件名.如果你不需要它,你可以放弃选项.

注意:sed需要因为我的系统md5sum在hash-sum本身之后产生一些东西.