【问题标题】:strange variables and functions definition in openwrt makefileopenwrt makefile中奇怪的变量和函数定义
【发布时间】:2013-08-20 21:31:22
【问题描述】:

我正在阅读openwrt的makefile,原始文件可以在这里找到: https://dev.openwrt.org/browser/trunk/target/linux/ramips/image/Makefile#L589

我无法理解这些行:

BuildFirmware/Default8M/squashfs=$(call BuildFirmware/OF,$(1),$(2),$(3),$(ralink_default_fw_size_8M),$(4))
BuildFirmware/Default8M/initramfs=$(call BuildFirmware/OF/initramfs,$(1),$(2),$(3),$(4))

Image/Build/Profile/MT7620a=$(call BuildFirmware/Default8M/$(1),$(1),mt7620a,MT7620a)

第一季度。 $(1), $(2).....这些变量从何而来?如何为它们分配值? Q2。如果 $(1) 是“squashfs”,是否意味着第 3 行正在调用第 1 行中定义的“函数”?在我看来,参数列表不匹配。 Q3。这些变量名中的斜杠“/”看起来很奇怪。这是定义变量的好方法吗?我认为我们可以将其更改为: Image_Build_Profile_MT7620a

提前致谢。

【问题讨论】:

    标签: makefile openwrt


    【解决方案1】:

    A1:变量$(1)$(2) 等是call 函数使用的占位符。来自the manual

    reverse = $(2) $(1)
    
    foo = $(call reverse,a,b)
    
    Here foo will contain ‘b a’. 
    

    A2:如果我们调用

    $(call Image/Build/Profile/MT7620a,squashfs)
    

    它将扩展到

    $(call BuildFirmware/Default8M/squashfs,squashfs,mt7620a,MT7620a)
    

    但是BuildFirmware/Default8M/squashfs 没有出现在您的列表中。第二行定义了BuildFirmware/Default8M/initramfs,但BuildFirmware/Default8M/squashfs 必须在其他地方定义。

    另一方面,如果我们调用

    $(call Image/Build/Profile/MT7620a,initramfs)
    

    它将扩展到

    $(call BuildFirmware/Default8M/initramfs,initramfs,mt7620a,MT7620a)
    

    然后

    $(call BuildFirmware/OF/initramfs,initramfs,initramfs,mt7620a,MT7620a)
    

    然后我们必须去寻找定义BuildFirmware/OF/initramfs的地方......这最终可能会导致回到第一行。

    A3:斜线的这种使用是可怕的,但合法。

    【讨论】:

    • 还有一件事。所以我们有:BuildFirmware/Default8M/initramfs=$(call BuildFirmware/OF/initramfs,$(1),$(2),$(3),$(4)) 和:$(call BuildFirmware/Default8M/initramfs,initramfs,mt7620a,MT7620a) 调用者提供了 3 个参数,但函数需要 4 个。为什么它被扩展为:$(call BuildFirmware/OF/initramfs,initramfs,initramfs,mt7620a,MT7620a) ??
    猜你喜欢
    • 2021-06-12
    • 2012-07-11
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多