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

Makefile GNU make:执行目标,但从文件中获取依赖项,makefile,gnu-make,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 @e

我希望执行目标公司的规则,但所有从属目标公司都应认为该目标公司已满足

我怎样才能做到这一点

例如:

$(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 > $@
如果存在$(网络共享)/foo.log:如果$(网络共享)/foo.log比foo.csv新,则应重建foo.csv;否则,不会发生任何事情(默认)

如果$(网络共享)/foo.log不存在(例如,服务器脱机、故障等),则只应打印一条指示问题的消息,但只有当foo.csv不存在时,才应生成foo.csv

我使用了.PHONY并返回了不同的返回值,但对于案例2,只要我在$(NETWORK\u SHARE)/foo.log上执行某个操作,就会发生昂贵的“导出”

问候 divB

太好了,多亏了我相关问题()中的答案,我现在可以提供一个解决方法:

.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
“旧_文件”是一个虚拟文件,必须存在,并且不应比任何其他文件更新(例如1/1/1971,00:00)

问候
divB看起来不像是使用一些旧文件(有人可能会无意中触摸到),而是可以使用仅限订单的先决条件。这里引用了GNU makefile手册(第4.3章)

然而,有时候,您会遇到想要强制执行 在不强制 如果执行其中一个规则,则要更新的目标。那么,, 您希望定义仅限订单的先决条件。仅订购先决条件 可以通过在必备项中放置管道符号(|)来指定 列表:管道符号左侧的任何先决条件都是正常的;任何 右侧的先决条件仅适用于订单:

 targets : normal-prerequisites | order-only-prerequisites

我知道没有一个干净的方法可以做到这一点,但是你可以用命令中的条件句来混淆它…嗨,谢谢你,这是我已经做过的,但是,我仍然有问题。我想我找到了一个重新表述的好方法:我想在一个最新的目标上输出一条消息(执行命令)。