Как я могу использовать макросы для генерации нескольких целей / правил Makefile внутри foreach? Таинственное поведение

Я использую GNU make 3.81. Вот тестовый make-файл, который демонстрирует проблему:

define BOZO

a$(1): b c
    touch a$(1)

endef

$(foreach i,1 2 3,$(call BOZO,$(i)))

Идея здесь состоит в том, чтобы использовать шаблон макроса (BOZO) для генерации правил, которые следуют предсказуемому шаблону.

Проблема: когда я запускаю make на этом make-файле, я получаю сообщение об ошибке:

Makefile.fake:10: *** multiple target patterns.  Stop.

(где строка 10 - это строка с foreach).

Теперь я знаю, на что обычно указывает эта ошибка. Давайте посмотрим, что эта линия расширяется с помощьюinfo функция для отправки расширения на стандартный выход. Я изменяю строку 10, чтобы быть:

$(info $(foreach i,1 2 3,$(call BOZO,$(i))))

и я бегу:

$ make -n

a1: b c
    touch a1

a2: b c
    touch a2

a3: b c
    touch a3

make: *** No targets.  Stop.

Обратите внимание, что ожидается сообщение «нет целей», так как функция $ (info ...) оценивается как пустая, но вызывает make дляРаспечатать сгенерированные правила.

Давайте тогда запустим эти правила?

$make -n > out.txt
make: *** No targets.  Stop.
$make -f out.txt a1 a2 a3
touch a1
touch a2
touch a3
$

Aaargh! Правила работают нормально. Итак ... ошибка в make или в моем понимании?

Последний ключ, который может помочь диагностировать: если я изменю строку foreach на:

$(foreach i,1,$(call BOZO,$(i)))

(так что foreach имеет только одну итерацию)

а затем сделать

$make a1

Я получаю другую ошибку:

make: *** No rule to make target `a1'.  Stop.

Я не знаю ни одного способа «увидеть» расширение$(foreach ) что делает видит кроме$(info ), и его вывод является законным, так что я довольно озадачен.

Ответы на вопрос(3)

Ваш ответ на вопрос