什么是符号管道' |'表示在Makefile中

时间:2017-10-15 09:22:26

标签: makefile openwrt

来自target/linux/ar71xx/image/Makefile

0100002 = O_LARGFILE|O_RDWR

请您帮助我理解这一行的含义,并提供一个如何在Makefile中使用符号管道KERNEL := kernel-bin | patch-cmdline | lzma | uImage lzma 的示例

2 个答案:

答案 0 :(得分:4)

这一行只是将make变量KERNEL设置为字符串kernel-bin | patch-cmdline | lzma | uImage lzma。管道符号(|)在这里没有特别的意义。

您必须查看变​​量的使用方式。很可能它出现在某个地方的食谱中,如下所示:

foo:
       $(KERNEL)

在这种情况下,扩展变量并将结果发送到shell。在shell中,管道符号使得来自lefto命令的stdout被连接到righ上的命令的stdin:它被称为管道或管道数据。

这里有4个命令的管道:kernel-bin&#39}的输出被发送到'patch-cmdline的输入,patch-cmdline的输出是发送到lzma的输入后,lzma的输出会发送到uImage lzma的输入。

答案 1 :(得分:0)

@MadScientist的建议非常正确,但在这种特定情况下,我认为它不是用于传递参数,而是用于顺序调用这些命令。

这是我的理解(如果错误,请纠正我)

This is where the variable is called$$(call concat_cmd,$$(KERNEL))

1- concat_cmd会致电split_args并将变量KERNELbuild_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 lzmabuild_cmd将扩展为Build/kernel-bin Build/ patch-cmdline ...