2

我正在寻找一种将 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 组合接近这个想法。

4

2 回答 2

2

你可以这样做:

文件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
于 2014-05-28T08:12:46.597 回答
2

您的示例将通过include A在开头添加来轻松完成B。新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的事情比拥有在其他地方被覆盖的代码带来的惊喜更少。

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

于 2014-05-28T08:10:52.090 回答