鉴于 Makefile 的这一点:
# for pattern matching
$(OBJDIR) := build
# just to see if a level of indirection will work
my_dir = $(dir $(1))
$(OBJECTS) : $(OBJDIR)/% : $(HEADERS) $(SRCDIR)/% | % $(dir %) $(call my_dir,%)
@echo output-only = $|
这是一个静态模式规则 http://www.gnu.org/software/make/manual/make.html#Static-Pattern with 仅订单先决条件 http://www.gnu.org/software/make/manual/make.html#Prerequisite-Types.
考虑目标“build/utility/debug.js”。上述规则的输出将是这样的:
output-only = utility/debug.js ./
- 第一个组件“utility/debug.js”是从主干 (%) 正确复制的。
- 第二个组件“./”是调用的输出
dir
先决条件列表中的功能。
- 第三个组成部分是一个空字符串,是调用 my 的输出
my_dir
先决条件列表中的功能。
如果我改变my_dir
对此:
my_dir = $(1)
输出保持不变。如果我把它改成这样:
my_dir = "foo"
然后抱怨没有规则可以制作“foo”(这是预期的)。那么看来$(1)
未在调用中绑定my_dir
.
这是怎么回事?为什么我不能将主干传递给函数?我有一个使用二次扩展的解决方法,但我想知道为什么我不能以这种方式编写规则。
EDIT:我是 stackoverflow 的新手,如果这不是这里做事的方式,请原谅我。
我想要 $(1) 因为我将词干作为参数传递给my_dir
,正如亚历克斯指出的那样。
我不知道为什么有人建议我想要“$”。我不相信 $ 本身可以扩展到任何上下文中的任何内容。
我知道自动变量仅在配方中可用。我没有在先决条件中使用自动变量 - 我正在使用主干:
每个目标都与目标模式进行匹配,以提取目标名称的一部分(称为词干)。该词干被替换到每个先决条件模式中以形成先决条件名称(每个先决条件模式中的一个)。- 手册 http://www.gnu.org/software/make/manual/make.html#Static-Usage
示例证明了茎可用的事实:单独使用时茎会扩展为正确的值,但传递给函数时则不会。