在目标配方中使用 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 语法扩展一个变量。只需删除评估。
在我正在编写的 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 语法扩展一个变量。只需删除评估。