我希望执行目标规则,但所有依赖目标都应将此目标视为满意。
我怎样才能做到这一点?
示例:
$(NETWORK_SHARE)/foo.log:
@echo Warning: server offline, still continue ...
@exit 0
foo.csv: $(NETWORK_SHARE)/foo.log
@echo Long export from a (different) server
@echo sleep 20
@echo foo > $@
如果$(NETWORK_SHARE)/foo.log存在:如果$(NETWORK_SHARE)/foo.log比foo.csv更新,则应重建foo.csv;否则没有应该发生(默认)
如果$(NETWORK_SHARE)/foo.log不存在(例如,服务器脱机,失败,......),则只应打印一条指示问题的消息,但只有在foo.csv不存在的情况下才能构建foo.csv存在。
我玩.PHONY并返回不同的返回值,但对于案例2,昂贵的"导出"一旦我在$(NETWORK_SHARE)/foo.log ...
上执行某些操作就会发生此致 DIVB
答案 0 :(得分:1)
看起来不是使用某些旧文件(有人可能会意外触摸),您可以使用仅订购的先决条件。以下是GNU makefile手册(第4.3章)
的引用但是,有时你会想要强加一个 在不强制执行的情况下调用规则的特定顺序 如果执行其中一个规则,则更新目标。在这种情况下, 您想要定义仅订单的先决条件。仅限订单的先决条件 可以通过在先决条件中放置管道符号(|)来指定 list:管道符号左侧的任何先决条件都是正常的;任何 右边的先决条件是仅限订单:
targets : normal-prerequisites | order-only-prerequisites
答案 1 :(得分:0)
太棒了,多亏了Thiton's在我的相关问题(Force make to find out-of-date condition from file)中的答案,我现在可以提供一个解决这个问题的黑客:
.PHONY: always-remake
NETWORK_SHARE = //server/dfs/common/logs
.PHONY: all
all: foo.csv
# file does not exist ...
ifeq "$(wildcard $(NETWORK_SHARE)/foo.log)" ""
old_file: always-remake
@echo Warning: network is not available ....
foo.csv: old_file
@echo Expensive export
@sleep 10
@echo $@ > $@
else
foo.csv: $(NETWORK_SHARE)/foo.log
@echo Doing expensive export since log file changed ...
@sleep 10
@echo $@ > $@
endif
“old_file”是一个虚拟文件,必须存在且不应该比任何其他文件更新(例如,1/1 / 1971,00:00)
此致 DIVB