1

我正在使用 make 来控制统计分析中的数据流。如果将我的原始数据放在一个目录./data/raw_data_files中,并且我有一个数据操作脚本,可以在./cache/clean_data. make 规则类似于:

cache/clean_data:
  scripts/clean_data 

我不想./data/使用 make 或我的任何数据修改脚本来触摸 中的数据。make 有什么方法可以为 cache/clean_data 创建一个依赖项,它只检查特定文件是否./data/比上次 make 运行时更新?

4

1 回答 1

2

如果clean_data是单个文件,就让它依赖于所有数据文件:

cache/clean_data: data/*
    scripts/clean_data

如果它是一个包含多个已清理文件的目录,最简单的方法是编写一个标记文件并让它依赖于您的数据文件:

cache/clean_data-stamp: data/*
    scripts/clean_data
    touch cache/clean_data-stamp

请注意,clean_data如果一个数据文件发生更改,这将重新生成所有文件。如果您在数据和已清理文件之间存在一对一的映射,则可以使用更精细的方法。GNU Make 手册有一个很好的例子。这是一个改编:

 DATAFILES:= $(wildcard data/*)
 CACHEFILES:= $(patsubst data/%,cache/clean_data/%,$(DATAFILES))

 cache/clean_data/% : data/%
         scripts/clean_data --input $< --output $@

 all: $(CACHEFILES)

在这里,我们使用通配符来获取data. 然后我们使用patsubst将数据路径替换为缓存路径。我们告诉make如何通过静态模式规则生成缓存文件,最后,我们定义一个目标all来生成所有需要的缓存文件。

当然,您也可以CACHEFILES在 Makefile ( ) 中明确列出您的内容,但如果可能的话CACHEFILES:= cache/clean_data/a cache/clean_data/b,让其自动处理通常更方便。make

请注意,这个复杂的示例可能只适用于 GNU Make,而不适用于 Windows 的 nmake。有关更多信息,请参阅GNU Make Manual,它是满足您所有 Makefile 需求的绝佳资源。

于 2014-04-07T07:23:45.263 回答