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