我有一个使用来自互联网的源文件的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;?
答案 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; - 您能够从互联网上成功获得的最新版本。