【问题标题】:"heritage" in MakefileMakefile 中的“遗产”
【发布时间】:2014-05-28 08:00:50
【问题描述】:

我正在寻找一种将 Makefile A 的部分重载到另一个 B 的方法,从而扩展 A

例如,我们有以下 makefile A

TEXT="AHAHA"

default: after-default

before-default: 
    echo "BEFORE DEFAULT"

default: before-default
    echo ${TEXT}

after-default: default
    echo "AFTER DEFAULT"

我想在新的 Makefile B 中重复使用它,如下所示:

TEXT="HIHIHI"

before-default: 
    echo "NEW BEFORE DEFAULT"

新的 makefile 将打印出来:

NEW BEFORE DEFAULT
HIHIHI
AFTER DEFAULT

这个例子有点荒谬,不可能像这样,但我想知道是否有可能让这样的Makefile组合接近这个想法。

【问题讨论】:

  • 你的依赖链是倒置的。输出将以相反的顺序打印。因为before-default依赖default,所以在处理before-default之前会先运行default
  • 啊,是的,我的错误,正在修复它。
  • 但是现在第一个生产是before-default,所以只是简单的make运行它。您想颠倒​​规则的顺序,以便 after-default 成为默认目标。

标签: makefile multiple-makefiles


【解决方案1】:

你可以这样做:

文件Makefile

# Define default TEXT
TEXT := HAHAHA

# Define default target
after:
    @echo AFTER

run:
    @echo $(TEXT)

before:
    @echo BEFORE

# Define dependencies
run: before
after: run

# Include the new makefile
include inheritance.mk

文件inheritance.mk

# Redefine TEXT
TEXT := HIHIHI

# Redefine before target
before:
    @ echo NEW BEFORE

当你运行make 你会收到一些警告,但它会按预期工作:

inheritance.mk:4: warning: overriding commands for target `before'
Makefile:10: warning: ignoring old commands for target `before'
NEW BEFORE
HIHIHI
AFTER

【讨论】:

    【解决方案2】:

    您的示例将通过在B 的开头添加include A 来轻松实现。新的before-default 目标将覆盖旧目标。

    vnix$ tail *
    ==> A <==
    TEXT="AHAHA"
    
    before-default: default
            echo "BEFORE DEFAULT"
    
    default: after-default
            echo ${TEXT}
    
    after-default:
            echo "AFTER DEFAULT"
    
    ==> B <==
    include A
    
    TEXT="HIHIHI"
    
    before-default: default
            echo "NEW BEFORE DEFAULT"
    
    vnix$ make -sf A
    AFTER DEFAULT
    AHAHA
    BEFORE DEFAULT
    
    vnix$ make -sf B
    B:6: warning: overriding commands for target `before-default'
    A:4: warning: ignoring old commands for target `before-default'
    AFTER DEFAULT
    HIHIHI
    NEW BEFORE DEFAULT
    

    不过,这不是一个很好的设计;参数化你已经用TEXT 做的事情比拥有在其他地方被覆盖的代码带来的惊喜更少。

    (请参阅我上面的评论:为什么输出与您希望的顺序相反。)

    【讨论】:

      猜你喜欢
      • 2010-09-24
      • 2018-10-18
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      相关资源
      最近更新 更多