代码之家  ›  专栏  ›  技术社区  ›  abbot

如何编写makefile规则以仅在文件丢失时下载该文件?

  •  7
  • abbot  · 技术社区  · 15 年前

    我正试图写一个makefile,它应该下载一些源文件,如果并且只有在它们丢失的情况下。

    类似:

    hello: hello.c
        gcc -o hello hello.c
    
    hello.c:
        wget -O hello.c http://example.org/hello.c
    

    但这当然会导致 hello.c 每次运行make命令时下载。我想 你好,C 仅当此生成文件丢失时才下载。GNU Make是否可以实现这一点?如果可以,如何实现这一点?

    4 回复  |  直到 6 年前
        1
  •  10
  •   JesperE    15 年前

    我猜wget不会更新hello.c上的时间戳,但会保留远程时间戳。这导致了 make 相信hello.c已经过时了,并尝试再次下载它。尝试

    hello.c:
            wget ...
            touch $@
    

    编辑:wget的-n选项将阻止wget下载任何内容,除非远程文件较新(当然,它仍然会检查远程文件的时间戳)。

        2
  •  6
  •   Douglas Leeder    15 年前

    因为makefile应该按您的需要工作,所以您需要检查一些不太可能的情况:

    1)检查是否没有 .PHONY 涉及源文件的规则。

    2)检查源目标名称是否与正在下载的文件路径匹配。

    你也可以试着跑步 make -d 要了解make为什么认为它需要“重新构建”源文件。

        3
  •  6
  •   LukáÅ¡ Lalinský    15 年前

    这个 Makefile 你写了下载 hello.c 只有它不见了。也许你还做错了什么?例如,请参见:

    hello: hello.c
            gcc -o hello hello.c
    
    hello.c:
            echo 'int main() {}' > hello.c
    

    以及:

    % make
    echo 'int main() {}' > hello.c
    gcc -o hello hello.c
    % rm hello
    % make
    gcc -o hello hello.c
    % rm hello*
    % make
    echo 'int main() {}' > hello.c
    gcc -o hello hello.c
    

    (the echo 第二次未执行命令)

        4
  •  0
  •   clhenrick    6 年前

    如果先决条件是 hello.c 已更改或为空,并且Make在文件存在时继续下载该文件,则阻止Make重新下载该文件的一个选项是使用目标正文中的标志来检测该文件是否存在:

    hello.c:
        test -f $@ || wget -O hello.c http://example.org/hello.c
    

    这个 test 命令将返回 true 如果 你好,C 文件存在,否则将返回 false 以及 wget 命令将运行。