Makefile 中的“遗产”

Posted

技术标签:

【中文标题】Makefile 中的“遗产”【英文标题】:"heritage" in Makefile 【发布时间】: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 成为默认目标。 【参考方案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 做的事情比拥有在其他地方被覆盖的代码带来的惊喜更少。

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

【讨论】:

以上是关于Makefile 中的“遗产”的主要内容,如果未能解决你的问题,请参考以下文章

通用 Makefile(及makefile中的notdir,wildcard和patsubst)

Makefile步步为营

Makefile 中的规则

如何调试makefile变量

Makefile文件_总述

Makefile中的函数