Я использую GNU make 3.81. Вот тестовый файл, который демонстрирует проблему:
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 имеет только одну итерацию)
а затем do
$make a1
Я получаю другую ошибку:
make: *** No rule to make target `a1'. Stop.
Я не знаю, как "видеть" расширение $(foreach )
, которое делает вид, кроме $(info )
, и его вывод легален, поэтому я довольно сильно озадачен.