我正在使用make来控制统计分析中的数据流。如果我的原始数据在目录./data/raw_data_files
中,并且我有一个数据操作脚本,可以在./cache/clean_data
创建清理数据缓存。 make规则类似于:
cache/clean_data:
scripts/clean_data
我不想触摸./data/
中的数据,无论是使用make还是我的任何数据修改脚本。 make中是否有任何方法可以为cache / clean_data创建依赖项,只检查./data/
中的特定文件是否比上次make run更新?
答案 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需求的绝佳资源。