首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从makefile获取makefile的名称

从makefile获取makefile的名称
EN

Stack Overflow用户
提问于 2009-09-09 14:26:46
回答 7查看 18.9K关注 0票数 30

如何在makefile中获取makefile的名称?

谢谢。

注:

我需要这样做,因为我希望我的makefile能够调用自己,但是makefile不是Makefile,所以我想写这样的东西:

代码语言:javascript
复制
target:
    ($MAKE) -f ($MAKEFILENAME) other_target
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-09-09 14:46:53

代码语言:javascript
复制
location = $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
WHERE_ART_THOU := $(location)
$(warning $(WHERE_ART_THOU))

我也相信这是GNU的特例,但我不太确定。

票数 15
EN

Stack Overflow用户

发布于 2009-09-09 16:35:41

(如果你有任何问题,请参考写得惊人的GNU制作手册。但请记住,就像Makefile一样,在将这些概念付诸实践之前,应该彻底阅读此手册)。

我想不出是怎么做到的。据我所知,你得做些体力活。

稍后,我将描述如何做到这一点,并展示引入current_makefile变量的脚本。但我首先要强调一个重要的概念。

您应该理解,如果我们有某种变量current_makefile,它扩展到当前的makefile名称,那么在读取makefile的过程中,它将不得不改变。这意味着它应该在“立即”扩展上下文中使用--即在读取makefile期间执行的命令中使用。然而,大多数命令都是在读取makefile之后执行的。因此,一些命令将平稳地打印正确的值,而在某些使用“延迟”展开的地方,它总是扩展到根makefile名称。

例如,如果您想要在规则文本中使用这个变量,就必须使用技巧,因为规则文本总是有延迟扩展的。所以,如果你有规则

代码语言:javascript
复制
rule:
        echo In makefile $(current_makefile):
        echo Making target $@

它将始终打印根makefile的名称。相反,要强制立即展开,您必须创建另一个具有makefile特定名称的变量(即这些变量的名称在每个makefile中应该不同):

代码语言:javascript
复制
this_makefile_unique_name := $(current_makefile)
rule:
        echo In makefile $(current_makefile):
        echo Making target $@

或者使用eval:.

代码语言:javascript
复制
define make_rule
rule:
        echo In makefile $(1):
        echo Making target $$@

$(eval $(call make_rule,$(current_makefile)))

如果只想将当前makefile的名称用于调试目的,请考虑特殊的调试函数,如警告或info:。

代码语言:javascript
复制
$(warning We're in makefile $(current_makefile))

这些函数使用“立即”展开,并将打印正确的值。

如何定义这样的$(current_makefile)?

您必须手动维护makefile包含的堆栈。当包含makefile时,它的名称被放置在堆栈的顶部;当从包含的makefile返回到外部的时候,最上面的名称将从堆栈中弹出。这是通过在makefile的开头和结尾插入特殊调用来实现的:

代码语言:javascript
复制
# Beginning of makefile
$(eval $(makefile_names_push))
#... makefile text
$(warning $(current_makefile))
#...
$(eval $(makefile_names_pop))
#End of file

现在,在根makefile的开头定义函数。

代码语言:javascript
复制
lastword=$(word $(words $(1)),$(1))

define makefile_names_push
current_makefile := $$(CURDIR)/$$(call lastword,$$(MAKEFILE_LIST))
makefile_stack :=$$(makefile_stack) $$(current_makefile)
endef

define makefile_names_pop
makefile_stack := $$(filter-out $$(current_makefile),$$(makefile_stack))
current_makefile := $$(call lastword,$$(makefile_stack))
endef

如果您确信make足够新(版本为3.81+),请将lastword调用替换为内置函数:。

代码语言:javascript
复制
#inctead of $$(call lastword,$$(MAKEFILE_LIST))
$$(lastword $$(MAKEFILE_LIST))

有用吗?

完全没用。这里唯一有用的方法是制作100个makefile,它们是到一个makefile的符号链接,这些makefile中的规则取决于它们的名称。但是它可以在手册中描述的makefile和foreach-eval技术中实现.所以我的帖子完全是浪费时间,虽然我有一些乐趣:-)

票数 12
EN

Stack Overflow用户

发布于 2011-01-26 20:24:08

这将返回调用的第一个Makefile的名称,即调用堆栈底部的名称:

代码语言:javascript
复制
MAKEFILE_JUSTNAME := $(firstword $(MAKEFILE_LIST))
MAKEFILE_COMPLETE := $(CURDIR)/$(MAKEFILE_JUSTNAME)

在非交叉递归情况下使用时(例如,make依赖性),它只是当前makefile的名称。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1400057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档