首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU-Make的自动变量是否仅限于当前配方定义?

GNU-Make的自动变量是否仅限于当前配方定义?
EN

Stack Overflow用户
提问于 2017-02-15 15:54:54
回答 3查看 122关注 0票数 0

对于某些场景,由GNU-Make创建的automatic variables非常方便:

代码语言:javascript
复制
.SECONDEXPANSION:

%-processed.md: $$(wildcard $$*.m4) $(wildcard macros/*.m4) %.md
    m4 $^ > $@

然而,当有人试图在makefile中的其他地方添加依赖项时,这个idilic世界就会爆炸:

代码语言:javascript
复制
.PHONY: force
force: ;

mybook-processed.md: force

现在m4突然抱怨说"force“不是一个有效的输入文件。当然不是,但它显示在$^变量中,因为它被附加到先决条件列表中。

有没有办法只访问直接配方定义中定义的前提条件,而忽略其他前提条件?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-15 22:10:48

不不可能。这些信息甚至在make的内部结构中都不可用。

不过,我不会使用您的示例解决方案。如果您的命令只接受某些类型的文件,我将使用filter来确保它只看到这些类型的文件:

代码语言:javascript
复制
.SECONDEXPANSION:

%-processed.md: $$(wildcard $$*.m4) $(wildcard macros/*.m4) %.md
        m4 $(filter %.m4 %.md,$^) > $@
票数 1
EN

Stack Overflow用户

发布于 2017-02-15 22:28:30

您可以为伪目标(比如MAGIC/force )采用一种命名约定。然后是$(filter-out MAGIC/%,$^) --仍然有点重复,但并不是那么糟糕。

票数 1
EN

Stack Overflow用户

发布于 2017-02-15 15:54:54

到目前为止,我找到的唯一方法是停止使用自动变量,并编写我自己的变量。我真的希望有人能提出一个更好的答案,但这是我目前的解决方案:

代码语言:javascript
复制
.SECONDEXPANSION:

process_prereqs = $(wildcard $1.m4) $(wildcarad macros/*.m4)
%-processed.md: %.md $$(call process_prereqs,$$*)
    m4 $(call process_prereqs,$$*) $< > $@

这样,只使用了更稳定的$<自动变量,而另一个变量更具可预测性,但代码有点重复。

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

https://stackoverflow.com/questions/42243547

复制
相关文章

相似问题

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