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