2013-08-20 2 views
0

Я читаю Makefile из OpenWRT, исходный файл может быть найден здесь: https://dev.openwrt.org/browser/trunk/target/linux/ramips/image/Makefile#L589странные переменные и функции определения в OpenWRT Makefile

Я не могу понять эти строки:

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

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/Default8M/initramfs = $ (вызов BuildFirmware/OF/initramfs, $ (1), $ (2), $ (3), $ (4)) ' и: '$ (вызов BuildFirmware/Default8M/initramfs, initramfs, mt7620a, MT7620a) ' вызывающий пользователь предоставляет 3 параметра, но функция ожидает 4. Как получится: ' $ (вызов BuildFirmware/OF/initramfs, initramfs, initramfs, mt7620a , MT7620a) '?? – kumo

Смежные вопросы