2013-08-20 57 views
0

我讀的OpenWrt的makefile文件的定義,原來的文件可以在這裏找到: https://dev.openwrt.org/browser/trunk/target/linux/ramips/image/Makefile#L589奇怪的變量和函數的OpenWrt生成文件

我不明白這些行:

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」,是否意味着第三行調用第一行定義的「函數」?在我看來,參數列表不匹配。 Q3。這些變量名稱中的斜線「/」看起來很奇怪。它是定義變量的好方法嗎?我想我們可以將其更改爲: Image_Build_Profile_MT7620a

在此先感謝。

回答

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:斜槓的使用是可怕的,但合法。

+0

還有一件事。 (BuildFirmware/OF/initramfs,$(1),$(2),$(3),$(4)) ' 和: '$(調用BuildFirmware/Default8M/initramfs,initramfs,mt7620a,MT7620a)' 調用者提供了3個參數,但函數期望爲4.如何將其擴展爲: '$(調用BuildFirmware/OF/initramfs,initramfs,initramfs,mt7620a ,MT7620a)'?? – kumo