Makefile 符号管道是什么'|';表示生成文件中的
从Makefile 符号管道是什么'|';表示生成文件中的,makefile,openwrt,Makefile,Openwrt,从 请您帮助我理解这一行的含义,并提供一个如何在Makefile中使用符号pipe的示例。这一行只是将make变量KERNEL设置为字符串KERNEL bin | patch cmdline | lzma | uImage lzma。管道符号(|)在这里没有特殊意义 您必须了解变量是如何使用的。它很可能出现在某个食谱中,如下所示: foo: $(KERNEL) 在这种情况下,变量被展开,结果被发送到shell。在shell中,管道符号使左侧命令的标准输出连接到右侧命令的标准输入:
请您帮助我理解这一行的含义,并提供一个如何在Makefile中使用符号pipe
的示例。这一行只是将make变量KERNEL
设置为字符串KERNEL bin | patch cmdline | lzma | uImage lzma
。管道符号(|
)在这里没有特殊意义
您必须了解变量是如何使用的。它很可能出现在某个食谱中,如下所示:
foo:
$(KERNEL)
在这种情况下,变量被展开,结果被发送到shell。在shell中,管道符号使左侧命令的标准输出连接到右侧命令的标准输入:它称为管道或管道数据
这里有一个由4个命令组成的管道:
kernel-bin
的输出被发送到'patch-cmdline
的输入,patch-cmdline
的输出被发送到lzma
的输入,lzma
的输出被发送到uImage-lzma
的输入。$$(调用concat\u cmd,$$(内核))
1-concat\u cmd
将调用split\u args
并将变量KERNEL
和build\u cmd
传递给它:
define concat_cmd
$(call split_args,$(1),build_cmd)
endef
2-split_args
将用空格替换
,并调用build_cmd
define split_args
$(foreach data, \
$(subst |,$(space),\
$(subst $(space),^,$(1))), \
$(call $(2),$(strip $(subst ^,$(space),$(data)))))
endef
3-最后,由于
KERNEL
被定义为KERNEL:=KERNEL bin | patch cmdline | lzma | uImage lzma
,build|u cmd
将扩展到build/KERNEL bin
build/patch cmdline
。手册:不,只有管道符号出现在先决条件列表中时才是这样。另外,在这种情况下,反馈只会有一个管道符号而不是3。Thx,我认为在这种情况下,它不用于在命令之间传递参数,我将发布我所了解的内容。我没有说“传递参数”,我说的是将输出转发到下一个命令的输入。这些是完全不同的事情。您在问题中链接的makefile不足以回答您的问题。它显示变量是在define
'd变量中分配的,但该变量从未在您提供的makefile中使用。您需要查看构建系统中的其他地方,以了解如何使用它。特别是查看BuildImage
变量的定义,该变量可能定义了一个使用KERNEL
变量的配方。事实上,问题中链接的makefile不是很充分,这就是为什么我还添加了一个答案,以澄清在我的案例中如何使用管道。
define split_args
$(foreach data, \
$(subst |,$(space),\
$(subst $(space),^,$(1))), \
$(call $(2),$(strip $(subst ^,$(space),$(data)))))
endef