#makefile #gnu-make
Вопрос:
Я хочу перебрать список, СПИСОК и хочу вызвать функцию, которая записывает что-то в текстовый файл, используя имя извлеченных элементов списка в качестве имени вызова «функции».
.PHONY: GEN_BAT
GEN_BAT:
for comp in $(basename $(notdir $(LIST))); do
echo comp: $comp ;
$(call $comp)
done;
Если я напишу строку $(call $$comp)
без a ;
, я получу «синтаксическую ошибку: неожиданный конец файла».
Если я напишу строку с исходной функцией, например $(call FUNCTION);
, с помощью a ;
, она вызовет существующую функцию, как и ожидалось. Итак, что-то не так с используемой переменной?
Как я могу убедить make
использовать значение $$comp
в качестве вызова «функции»?
Ответ №1:
Совершенно непонятно, что вы хотите сделать; предоставление полного, минимального примера очень помогло бы.
Однако невозможно использовать цикл оболочки, а затем попытаться использовать переменную цикла оболочки в функции make. Если вы подумаете об этом, это не имеет никакого смысла: оболочка-это совершенно другая программа, чем make, make не может знать, на что установлены переменные оболочки, и оболочка не может вызывать функции make.
Make выполняет команду, подобную этой: сначала весь рецепт расширяется, чтобы ВСЕ переменные и функции make были разрешены. Затем make берет эту расширенную командную строку и передает ее оболочке, а оболочка обрабатывает ее как сценарий оболочки. Make ожидает завершения работы оболочки, затем сообщает код выхода как успех (0) или сбой (не 0).
Кроме того, утверждение типа $(call xyz)
не имеет реального смысла в make: вызов функции без аргументов идентичен простому расширению переменной, как в $(xyz)
. Единственное время call
имеет смысл, если вы передадите ему аргументы.
Комментарии:
1. теперь я понимаю свое недостающее звено. Поскольку я использую оболочку для цикла, я работаю внутри оболочки, а не в среде make. И, как вы объясняете, эти две стороны ничего не знают друг о друге. Спасибо за подсказку.
2. ДА. Более конкретно, это односторонний способ: make развернет все свои переменные, а затем вызовет оболочку с результатами. Таким образом, make может повлиять на то, что будет выполняться оболочкой (конечно), но ничто из того, что происходит в оболочке, не может вызывать функции make и т. Д.