GNU make:执行目标但从文件中获取依赖性

时间:2012-06-19 15:49:06

标签: makefile gnu-make

我希望执行目标规则,但所有依赖目标都应将此目标视为满意。

我怎样才能做到这一点?

示例:

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

2 个答案:

答案 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