【问题标题】:gnu make reloads includes but doesn't update the targetsgnu make reloads 包括但不更新目标
【发布时间】:2010-09-27 16:24:24
【问题描述】:

我正在尝试创建一个 Makefile,它将下载和处理文件以生成目标文件,这是一个简化版本:

default: all
.PHONY: all clean filelist.d
clean:
    @rm -fv *.date *.d

#The actual list comes from a FTP file, but let's simplify things a bit
filelist.d:
    @echo "Getting updated filelist..."
    @echo "LIST=$(shell date +\%M)1.date $(shell date +\%M)2.date" > $@
    @echo 'all: $$(LIST)' >> $@

%.date:
    touch $@

-include filelist.d

不幸的是,目标 all 在第一次运行时没有正确更新,需要再次运行才能获取文件。这是我从中得到的输出:

 $ make
Getting updated filelist...
make: Nothing to be done for `default'.
 $ make
Getting updated filelist...
touch 141.date
touch 142.date
touch 143.date

我正在使用 GNU Make 3.81,其文档指出,如果包含的文件发生更改,它将重新加载整个内容。出了什么问题?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    您已将 filelist.d 指定为 .PHONY 目标,因此 make 认为创建该目标实际上不会更新指定的文件。但是,确实如此,并且新内容将在下一次运行时使用。对于第一次运行,丢失的文件不是错误,因为 include 以破折号为前缀。

    从 .PHONY 中删除 filelist.d。但是,请记住,在您删除它之前,它不会再次重新生成(因为它不依赖于任何东西)。

    出于同样的原因,您应该在 .PHONY 中包含“默认”。


    我写了一个 shell 脚本,而不是把所有这些都放在 makefile 中:

    #!/bin/bash
    # Check whether file $1 is less than $2 days old.
    
    [ $# -eq 2 ] || {
      echo "Usage: $0 FILE DAYS" >&2
      exit 2
    }
    
    FILE="$1"
    DAYS="$2"
    
    [ -f "$FILE" ] || exit 1  # doesn't exist or not a file
    
    TODAY=$(date +%s)
    TARGET=$(($TODAY - ($DAYS * 24 * 60 * 60)))
    MODIFIED=$(date -r "$FILE" +%s)
    
    (($TARGET < $MODIFIED))
    

    将 X 替换为再次下载 filelist.d 之前可以经过的最大天数:

    filelist.d: force-make
            ./less-than-days $@ X || command-to-update
    .PHONY: force-make
    force-make:
    

    现在 filelist.d 依赖于一个 .PHONY 目标,而不是一个假的。这意味着 filelist.d 总是过时的(假目标总是“新的”),但它的配方只会定期更新文件。

    不幸的是,这需要您将更新命令编写为单个命令,如果太长,空间可能会成为问题。在这种情况下,我也会把它放在一个单独的脚本中。

    【讨论】:

    • 谢谢,不过有一个问题,因为我不知道 ftp 服务器什么时候更新,所以我需要在每次运行时重新创建 filelist.d,但至少我明白是什么继续。
    • 遗憾的是,您无法在 make 中指定 URL 作为依赖项,以便检查远程 url 的时间戳。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多