Makefile:执行作为要调用的参数传递的内置函数

Makefile:执行作为要调用的参数传递的内置函数,makefile,gnu-make,Makefile,Gnu Make,我正在编写以下生成文件: CHECK = $($1 $2) $(info $(call CHECK,dir,a/b/c)) stop: 并在GNU Make 4.3中以不带参数的方式执行它。我期望在输出中得到的是a/b/,但我得到的却是空行 我的实际问题是如何在其他宏中传递/获取/使用内置函数以使这些传递的函数工作?这可能吗 注意:实际的Makefile稍微复杂一些,但是这个简短的示例演示了这个想法。我知道我可以只写$(dira/b/c),但这不是我想要的 UPD:我的实际用例如下。我有一个

我正在编写以下生成文件:

CHECK = $($1 $2)
$(info $(call CHECK,dir,a/b/c))

stop:
并在GNU Make 4.3中以不带参数的方式执行它。我期望在输出中得到的是
a/b/
,但我得到的却是空行

我的实际问题是如何在其他宏中传递/获取/使用内置函数以使这些传递的函数工作?这可能吗

注意:实际的Makefile稍微复杂一些,但是这个简短的示例演示了这个想法。我知道我可以只写
$(dira/b/c)
,但这不是我想要的

UPD:我的实际用例如下。我有一个在模板管道中处理的文件列表(具有
%
)规则。其中一些文件的名称中有空格,为了正确解释它们的名称,我使用以下技巧:

ESCAPE_IN_SHELL = sed -E 's,_,_1,g;s, ,_2,g'
ESCAPE = $(subst $() ,_2,$(subst _,_1,$1))
UNESCAPE = $(subst _1,_,$(subst _2, ,$1))
MAP = $(foreach A,$2,$(call $1,$A))

# Names acquisition
NAMES != ls in_dir | ${ESCAPE_IN_SHELL}

trans_dir/% : in_dir/%
    mkdir -p $(dir $@)
    ...

out_dir/% : trans_dir/%
    ...

main_rule : $(call MAP,UNESCAPE,${NAMES})
问题在于
mkdir-p$(dir$@)
$(dir…
包含空格时如何解释
$@
。我要解决的是将
$(dir$@)
替换为
$(调用UNESCAPE,$(dir$(调用ESCAPE,$@))

但我发现,通过创建以下附加函数,可以概括和缩短解决方案:

SAFE = $(call UNESCAPE,$($1 $(call ESCAPE,$2)))

它应该像
$(call SAFE,dir,$@)
一样使用。在这里,我面临的问题是
dir
没有按预期进行扩展。

我没有阅读问题的所有详细信息,但是如果
调用
函数的文档对此非常清楚:

如果variable是内置函数的名称,则始终调用内置函数(即使使用该名称的make变量也存在)

因此,如果要调用函数,包括内置函数,则不能使用:

CHECK = $($1 $2)
您必须使用:

CHECK = $(call $1,$2)

这似乎很复杂,但您似乎在寻找
$(eval…
@tripleee,您能否提供一个使用
eval
的示例?
$(eval$$(info$$(dir a/b/c))
按您的要求执行,但它不太可能直接有用。也许你的问题是为了演示一个案例,在这个案例中,这是非常有用的,这样我们就可以看到更多的上下文了。@tripleee,我也找到了,谢谢!这正是我需要的@tripleee,嗯,看起来像
$(eval$$(info$$(dir a/b/c))
$(dir a/b/c)
的结果放入make的进程标准输出,但不在“评估上下文”中。所以它看起来只有在我自己写给stdout的时候才起作用,没有进一步消费它