Directory Makefile规则取决于目录内容更改

Directory Makefile规则取决于目录内容更改,directory,makefile,dependencies,Directory,Makefile,Dependencies,使用Make是依赖目录内容的好方法 本质上,我有一些应用程序代码所依赖的生成代码。生成的代码只需要在目录内容发生更改时进行更改,而不必在目录中的文件内容发生更改时进行更改。因此,如果文件被删除、添加或重命名,我需要运行该规则 我的第一个想法是生成目录的文本文件列表,并将其与最后一个列表进行区分。更改意味着重新运行构建。我想我必须将generate和diff部分传递给bash脚本 我希望在他们无限的智慧中可能会有一个更简单的解决方案。假设您的目录名为dir,那么这个makefile将满足您的需要:

使用Make是依赖目录内容的好方法

本质上,我有一些应用程序代码所依赖的生成代码。生成的代码只需要在目录内容发生更改时进行更改,而不必在目录中的文件内容发生更改时进行更改。因此,如果文件被删除、添加或重命名,我需要运行该规则

我的第一个想法是生成目录的文本文件列表,并将其与最后一个列表进行区分。更改意味着重新运行构建。我想我必须将generate和diff部分传递给bash脚本


我希望在他们无限的智慧中可能会有一个更简单的解决方案。

假设您的目录名为
dir
,那么这个makefile将满足您的需要:

FILES = $(wildcard dir/*)

codegen: dir # Add $(FILES) here if you want the rule to run on file changes too.
    generate-my-code

正如评论所说,如果你想让代码也依赖于文件内容,你也可以添加
FILES
变量。

感谢gjulianm,他让我走上了正确的道路。他的解决方案适用于单个目录

为了让它递归地工作,我做了以下工作

ASSET_DIRS = $(shell find ../../assets/ -type d)
ASSET_FILES = $(shell find ../../assets/ -type f -name '*')

codegen: ../../assets/ $(ASSET_DIRS) $(ASSET_FILES)
     generate-my-code

现在看来,对目录或文件的任何更改(添加、删除、重命名、修改)都将导致此规则运行。此处的文件名可能存在一些问题(空格可能会导致问题)。

规则依赖于目录的缺点是,对该目录的任何更改都将导致规则过期,包括在该目录中创建生成的文件。因此,除非您将源文件和目标文件分离到不同的目录中,否则规则将在每个
make
上触发

这里有一种替代方法,允许您指定与添加、删除和更改相关的文件子集。例如,假设只有
*.foo
文件相关

# replace indentation with tabs if copy-pasting

.PHONY: codegen
codegen:
        find . -name '*.foo' |sort >.filelist.new
        diff .filelist.current .filelist.new || cp -f .filelist.new .filelist.current
        rm -f .filelist.new
        $(MAKE) generate

generate: .filelist.current $(shell cat .filelist.current)
        generate-my-code

.PHONY: clean
clean:
        rm -f .filelist.*

codegen规则中的第二行确保仅当相关文件列表发生更改时才修改
.filelist.current
,从而避免了
生成
规则的误报触发。

这可以工作,但不会递归工作。有问题的目录中有目录。此目录可能与的重复项适用于删除吗?我还没有机会测试它,但我想删除它只会消除该文件的依赖性。编辑:当然,如果删除,目录会被更新。我明白了。也许不需要“-name”*”,find将已经找到所有文件?请注意“*”可以避免包含隐藏的文件,这可能是可取的