【问题标题】:Make dummy target that checks the age of an existing file?制作检查现有文件年龄的虚拟目标?
【发布时间】:2014-04-07 07:08:24
【问题描述】:

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

cache/clean_data:
  scripts/clean_data 

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

【问题讨论】:

    标签: makefile dependencies data-manipulation data-management


    【解决方案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 手册有一个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将数据路径替换为缓存路径。我们通过static pattern rule告诉make如何生成缓存文件,最后我们定义一个目标all,它会生成所有需要的缓存文件。

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

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

    【讨论】:

    • 想详细说明一下?这听起来很有用:)
    • 啊,这很酷。我不能在这个项目中使用它,因为它不是一对一的,但我可以看到它在未来很有用。
    猜你喜欢
    • 2018-12-01
    • 2021-01-13
    • 2011-05-15
    • 1970-01-01
    • 2013-06-20
    • 2012-03-21
    • 2012-10-08
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多