Makefile中的“遗产”

时间:2014-05-28 08:00:51

标签: makefile multiple-makefiles

我想方法将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组合接近这个想法。

2 个答案:

答案 0 :(得分: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这样的参数化事件比在其他地方重写代码的意外更少。

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

答案 1 :(得分: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