GNU использует значение переменной для вызова «функции»

#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 и т. Д.