Я использую 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 print сгенерированные правила.
Давайте тогда запустим эти правила?
$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 )
, которое делает make, за исключением $(info )
, и его вывод допустим, так что я весьма озадачен.