Как я могу использовать макросы для генерации нескольких целей / правил 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 )
, и его вывод является законным, так что я довольно озадачен.