как избежать расширения переменной для цикла bash for в define makefile

#makefile #gnu-make

#makefile #gnu-make

Вопрос:

Обычно я использую вызов foreach в makefile. Несмотря на это, я хотел попробовать разные подходы. Для этого я создал приведенный ниже код.

Я использую GNU Make 3.81. Я заменил eval на info, чтобы понять, что происходит. Я не могу избежать как вызова, так и расширения eval, чтобы сохранить $file

Я имею в виду, когда я открываю файл, я получаю: «для файла в *.v; выполнить echo ; echo; готово; > trial.sh;»

 define create_area
$(1): $(2)
    mkdir -p $$(@D); 
    cp -nLr -v $(2)/* $$(@D); 
    cd $$(@D); 
    for file in *.v; do echo $$(file); 
    done; 
    " > trial.sh;

$(foreach a,$(A1) $(A2),
$(foreach b,$(B1),
$(eval $(call create_area,$(a),$(b)))))
  

Заранее благодарю,

Ответ №1:

Вы почти на месте.

Если вы запускаете цикл в командной строке, вы должны предварять имя переменной символом ‘$’, чтобы оно было расширено.

Если вы помещаете эту команду в рецепт makefile, чтобы предотвратить слишком быстрое расширение имени переменной Make (когда переменной еще не присвоено значение), вы должны предшествовать («escape») этому ‘$’ другим ‘$’.

Если вы поместите этот рецепт в определение, которое вы будете расширять с помощью call , вы должны удвоить каждый из них:

 for file in *.v; do echo $$$$file; done
  

Комментарии:

1. Большое вам спасибо. Это сработало, как и ожидалось, и я чувствую себя немного глупо. Еще один вопрос. Конечно, я пробовал $$ ($$ (file)), каким-то образом это имело смысл на мой взгляд. Но это не работает. Это потому, что, поскольку знаки доллара не расположены вместе, это интерпретируется как расширения двух переменных? Заранее благодарю,

2. Не должно ли это быть $$$$file вместо $$($$(file)) or $$$$(file) ? Это переменная оболочки, а не переменная make.

3. да, это должен быть файл $$$$. В противном случае оболочка думает, что пытается выполнить командный файл.

4. @RenaudPacalet: Вы правы, спасибо, я отредактирую.