0

我希望执行目标的规则,但所有依赖目标都应认为该目标已满足。

我怎样才能做到这一点?

例子:

$(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

4

2 回答 2

1

看起来您可以使用仅限订单的先决条件,而不是使用一些旧文件(有人可能会意外触摸)。这是 GNU makefile 手册(第 4.3 章)的引述

但是,有时您会遇到这样的情况,即您希望对要调用的规则施加特定的顺序,而不是在执行这些规则之一时强制更新目标。在这种情况下,您想要定义仅订单的先决条件。可以通过在先决条件列表中放置管道符号 (|) 来指定仅订单先决条件:管道符号左侧的任何先决条件都是正常的;右侧的任何先决条件都是仅订购的:

 targets : normal-prerequisites | order-only-prerequisites
于 2014-01-10T01:53:10.180 回答
0

太好了,感谢Thiton在我的相关问题(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

于 2012-06-20T14:43:25.750 回答