作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用来自互联网的源文件的生成文件。该文件有两个位置,我认为这两个位置都不可靠,因此我还保留了一个本地副本。所以我的 makefile 的相关行如下所示:
src.c:
wget -nv http://location.com/$@ || wget -nv http://otherplace.com/$@ || cp local/$@ .
src.o: src.c
$(CC) -o $@ $<
这是执行此操作的“正确方法”吗?如果在创建目标的每种不同方式中有多个步骤怎么办 - 我如何告诉 make“尝试 A。如果 A 失败,请尝试 B。如果 B 失败,...”?
最佳答案
正确的做法是:
.PHONY: phony
src.c: phony
if (wget -nv http://location.com/$@ -O $@.temp) && ! diff $@.temp $@ >/dev/null; then \
mv $@.temp $@; \
fi
我将你的命令缩短为单个 wget
但你可以在那里放任何你想要的东西,包括一系列 ||
来实现“试试这个,如果没有,尝试那个等等”。只要确保它输出到一个临时文件(并且不会无限期地挂起!)。
事实上在这里使用 phony
很重要,而不仅仅是 .PHONY
。你能看出原因吗?
此外,使用此方法,不再需要保留另一个“本地”副本和/或使用 cp
。您的目标 src.c
您的“本地副本” - 您能够从 Internet 成功获得的最新副本。
关于makefile - 尝试不同方法来制作目标的标准 makefile 习语是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26154551/
场景如下: 我将我的应用程序运行所需的几个 .xml(某种配置)文件捆绑在一个 .jar 文件中。 jar 文件具有以下结构: settings-1.0.0.jar ˪ resources/ ˪
我是一名优秀的程序员,十分优秀!