Как передать переменную в подпрограмму make, вызываемую функцией foreach в Makefile?

Я хочу сделать суб сделать в цикле с переменной KDIR передается в Makefile вызывается в module/ папка.

sub_make=$(MAKE) -C module all KDIR=$(1);

SUB_DIRS= k1 k2 k3 

all:  
    @$(foreach n, $(SUB_DIRS), $(call sub_make, $(n)))

Содержание Makefile в module/ папка очень проста, как показано ниже:

all:
    echo $(KDIR)

Но я получаю следующие ошибки:

make[1]: *** No rule to make target 'k1'.  Stop.
make[1]: Leaving directory '/home/r/Desktop/work/test/module'
make[1]: Entering directory '/home/r/Desktop/work/test/module'
echo 

make[1]: *** No rule to make target 'k2'.  Stop.
make[1]: Leaving directory '/home/r/Desktop/work/test/module'
make[1]: Entering directory '/home/r/Desktop/work/test/module'
echo 

make[1]: *** No rule to make target 'k3'.  Stop.
make[1]: Leaving directory '/home/r/Desktop/work/test/module'
Makefile:6: recipe for target 'all' failed
make: *** [all] Error 2

Кто-нибудь может решить это?

2 ответа

Решение

Удалить пробел. + Изменить

@$(foreach n, $(SUB_DIRS), $(call sub_make, $(n)))

чтобы:

@$(foreach n, $(SUB_DIRS), $(call sub_make,$(n)))

С пространством,

$(MAKE) -C module all KDIR=$(1);

будет расширяться до:

make -C module all KDIR= k1;
make -C module all KDIR= k2;
make -C module all KDIR= k3;

что (надеюсь), очевидно, неправильно.

Существует как минимум два способа отладки вашего make-файла. Один попытаться make -n, который распечатает вышеупомянутое. Или вы можете удалить @, который будет делать то же самое.

Последнее предупреждение:

Будьте осторожны при добавлении пробелов в аргументы call, Как и в случае с другими функциями, любые пробелы, содержащиеся во втором и последующих аргументах, сохраняются; это может вызвать странные последствия. Как правило, наиболее безопасно удалить все лишние пробелы при предоставлении параметров call,

Другие вопросы по тегам