【问题标题】:GNU make: Execute target but take dependency from fileGNU make:执行目标但从文件中获取依赖项
【发布时间】:2012-06-19 15:49:05
【问题描述】:

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

我怎样才能做到这一点?

例子:

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

【问题讨论】:

  • 我知道没有干净的方法可以做到这一点,但你可以用命令的条件来混合它......
  • 嗨,谢谢你,我已经这样做了,但是,我仍然有问题。我想我找到了一种重新制定的好方法:我想在最新的目标上输出一条消息(执行命令)

标签: makefile gnu-make


【解决方案1】:

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

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

 targets : normal-prerequisites | order-only-prerequisites

【讨论】:

    【解决方案2】:

    太好了,感谢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

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 2015-05-09
      • 2018-01-15
      • 1970-01-01
      相关资源
      最近更新 更多