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

标签 makefile

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

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

最佳答案

如果您需要依赖文件数量,那么...为什么不只依赖文件数量本身?该数字将表示为一个虚拟文件,当指定的文件数量在 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...

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

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

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

注意:需要 sed 是因为在我的系统上 md5sum 在哈希和本身之后会产生一些东西。

关于Makefile 规则取决于文件数量/标题的变化,而不是文件内容的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2452634/

相关文章:

python - 从 Makefile 生成文本文件的好方法是什么?

c - 当程序通过 Makefile 在后台运行时,为什么 write() 调用不在终端上显示输出?

Makefile 调用函数。如何获取所有参数

c - 错误 : called object ‘0’ is not a function

c++ - 根据 Makefile 中的目标更改变量

makefile - 使错误 : missing separator

makefile - cmake:如何添加仅执行shell脚本的add_custom_command?

xcode - 使用 Xcode 作为 Javascript IDE,可以吗?

opencv - make 和 make -j5 有什么区别?

makefile可以用来插入代码吗?