我正在读取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
提前致谢。
答案 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:这种斜线的使用是可怕的,但是合法的。