什么是标准的makefile习惯用法,用于尝试制作目标的不同方法

时间:2014-10-02 04:38:35

标签: makefile

我有一个使用来自互联网的源文件的makefile。文件所在的位置有两个,我认为这两个位置都不可靠,因此我还保留了本地副本。所以我的makefile的相关行看起来像:

src.c:
    wget -nv http://location.com/$@ || wget -nv http://otherplace.com/$@ || cp local/$@ .

src.o: src.c
    $(CC) -o $@ $<

这是&#34;正确的方式&#34;去做这个?如果创建目标的每种不同方式都有多个步骤怎么办?如何告诉make&#34;尝试A.如果A失败,请尝试B.如果B失败,......&#34;?

1 个答案:

答案 0 :(得分:0)

正确的做法是:

.PHONY: phony
src.c: phony
    if (wget -nv http://location.com/$@ -O $@.temp) && ! diff $@.temp $@ >/dev/null; then \
     mv $@.temp $@; \
    fi 

我将你的命令缩短为一个wget,但是你可以把你想要的任何东西放在那里,包括一系列||来实现&#34;试试这个,如果没有,试试那个&#34 34 ;.只需确保它输出到一个临时文件(并且不会无限期挂起!)。

在此处使用phony非常重要,而不仅仅是.PHONY。你能明白为什么吗?

此外,通过这种方法,不再需要保留另一个&#34; local&#34;复制和/或使用cp。您的目标src.c 您的本地副本&#34; - 您能够从互联网上成功获得的最新版本。