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 中的“遗产”的主要内容,如果未能解决你的问题,请参考以下文章