制作用于检查现有文件年龄的虚拟目标?

时间:2014-04-07 07:08:24

标签: makefile dependencies data-manipulation data-management

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

cache/clean_data:
  scripts/clean_data 

我不想触摸./data/中的数据,无论是使用make还是我的任何数据修改脚本。 make中是否有任何方法可以为cache / clean_data创建依赖项,只检查./data/中的特定文件是否比上次make run更新?

1 个答案:

答案 0 :(得分:1)

如果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 Manual有一个decent example of this。这是一个改编:

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

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

 all: $(CACHEFILES)

在此,我们使用wildcard获取data下所有文件的列表。然后,我们使用patsubst将数据路径替换为缓存路径。我们告诉make如何通过static pattern rule生成缓存文件,最后,我们定义了一个生成所有必需缓存文件的目标all

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

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