来自target/linux/ar71xx/image/Makefile
0100002 = O_LARGFILE|O_RDWR
请您帮助我理解这一行的含义,并提供一个如何在Makefile中使用符号管道KERNEL := kernel-bin | patch-cmdline | lzma | uImage lzma
的示例
答案 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
并将变量KERNEL
和build_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_cmd
将扩展为Build/kernel-bin
Build/ patch-cmdline
...