在目标配方中使用 eval

Use of eval in a target recipe

在我正在编写的 Makefile 中,我有兴趣清理一些 CC 打印和集中一些构建准备工作(比如在构建树中创建目录)。我认为宏非常适合这项任务。这实际上是我试图做的,用于各种 Makefiles:

define func
    @mkdir -p $$(dir $(1))
    @printf "%-5s $(2)\n" $(3)
endef

test:
    @echo Run
    $(eval $(call func,a,b,c))

我的想法是,在第一次扩展后我会得到类似的东西(可能没有任何标签,我不确定扩展在 eval 中是如何工作的):

test:
    @echo Run
    $(eval @mkdir -p $(dir a)\n@printf "%-5s b\n" c

当然最后命令会被执行。然而,我得到的是:

# make
Makefile:7: *** recipe commences before first target.  Stop.

我将 eval 更改为 info 并得到了这个:

        @mkdir -p $(dir a)
        @printf "%-5s b\n" c
Run

所以我想也许我在宏定义中的显式制表符引起了麻烦,所以我删除它们并重试:

# make
Makefile:7: *** missing separator.  Stop.

所以还是不行。如果确实有可能,那么宏中的缩进似乎具有某种功能,或者我可能错误地定义了宏。我想也许宏中的两个命令造成了麻烦(因为投诉是关于分隔符的),但将宏减少到一行也无济于事。

你不想 eval 在这里。 Eval 用于评估 makefile 语法。也就是说,您正在评估的东西必须是有效的、完整的 makefile。您可以看到 info 打印的不是有效的 makefile。如果将其放入文件并 运行 make -f <file>,则会出现语法错误。

您只是想为 shell 语法扩展一个变量。只需删除评估。