openwrt makefile中的奇怪变量和函数定义

时间:2013-08-20 12:44:03

标签: makefile openwrt

我正在读取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)

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

提前致谢。

1 个答案:

答案 0 :(得分: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:这种斜线的使用是可怕的,但是合法的。