GNU Make中自定义函数调用输出被Shell当作独立命令执行问题
问题原因分析
你遇到的问题是由多个语法和使用错误共同导致的:
- 自定义函数定义语法错误:GNU Make 中结束
define块的关键字是endef,你写的end不会被 Make 识别为块结束标记,这就导致你写的函数块没有被正确解析为自定义函数,块内的缩进、换行都会被原样保留到后续展开的内容中。 - 函数名拼写不一致:你定义的函数名是
comma-seperated,调用时写成了comma-sepperated(多了一个字母p),就算函数定义正确,Make 也找不到对应的处理逻辑。 - 换行符被识别为命令分隔:即使忽略前两个错误,你的函数体中
$(shell)表达式前有缩进,块内自带换行,当函数展开到 Make 规则的命令行时,换行符会被 Make 识别为不同命令的分隔符。原本应该和Hey拼接在同一行的内容,会被拆分为单独的一行,Shell 会直接把这行字符串当做命令执行,自然就抛出了命令不存在的报错。
更优的实现方案
你要的逗号分隔功能完全不需要调用 Shell,用 Make 内置函数就能实现,避免额外的进程开销和语法坑:
# 先定义用到的分隔符变量 null := space := $(null) $(null) comma := , define comma-separated $(subst $(space),$(comma),$(strip $(1))) endef names := John Paul George Ringo .PHONY: test test: @echo Hey $(call comma-separated,$(names))
运行后会直接输出 Hey John,Paul,George,Ringo,符合预期。
内容的提问来源于stack exchange,提问作者Thermatix
相关产品推荐
相关产品推荐

