【问题标题】:What does the symbol pipe '|' means in a Makefile符号管道'|'是什么在 Makefile 中表示
【发布时间】:2017-10-15 09:22:26
【问题描述】:

来自target/linux/ar71xx/image/Makefile

KERNEL := kernel-bin | patch-cmdline | lzma | uImage lzma

能否请您帮助我理解这一行的含义,并提供一个有关如何在 Makefile 中使用符号管道 | 的示例

【问题讨论】:

标签: makefile openwrt


【解决方案1】:

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

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

foo:
       $(KERNEL)

在这种情况下,变量被展开并且结果被发送到 shell。在 shell 中,管道符号导致左侧命令的标准输出连接到右侧命令的标准输入:它被称为管道或管道数据。

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

【讨论】:

  • 感谢反馈,我认为在这种情况下它不用于在命令之间传递参数,我会发布我理解的内容
  • 我没有说“传递参数”,我说将输出转发到下一个命令的输入。这些是完全不同的事情。您在问题中链接到的生成文件不足以回答您的问题。它显示该变量是在 define'd 变量内分配的,但该变量从未在您提供的 makefile 中使用。您需要查看构建系统中的其他位置以了解它是如何使用的。特别要查找BuildImage 变量的定义,该变量可能定义了使用KERNEL 变量的配方。
  • 确实,问题中链接的makefile不是很充分,这就是为什么我还添加了一个答案来澄清我的情况下如何使用管道。
【解决方案2】:

“|”还有另一种用法管道符号 - 仅定义仅提供目标排序而不构建依赖关系的先决条件:

例如:

OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

$(OBJDIR)/%.o : %.c
        $(COMPILE.c) $(OUTPUT_OPTION) $<

all: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR):
        mkdir $(OBJDIR)

参考:https://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html

【讨论】:

    【解决方案3】:

    @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 ...

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 2013-03-10
      • 2012-01-26
      • 1970-01-01
      • 2012-12-27
      相关资源
      最近更新 更多