1) Я предпочитаю использовать bash в качестве оболочки, потому что я к этому привык. Поэтому я использую SHELL:=/bin/bash
в начале моих make-файлов. Но тогда весь ваш makefile не работает, когда система не предоставляет /bin/bash..
2) Если вы хотите использовать одну и ту же оболочку для всех строк в рецепте, вы можете использовать специальную цель .ONESHELL
Это не позволяет вам использовать ;\
после каждой строки без пробелов позади (подвержен ошибкам). Но если вы используете .ONESHELL
, то это верно для ВСЕХ рецептов в вашем make-файле (который я использую, но вы, возможно, не захотите).
3) Если runners
не является файлом (и, похоже, это так, потому что вы не создаете файл в рецепте), я бы порекомендовал сделать его .PHONY
. Это не позволяет make выполнить его, когда есть файл с именем runners.
4) Двойные скобки ((...))
используются для арифметического расширения. Он просто не может сравнивать строки. Используйте одинарные или двойные скобки. Смотрите этот великий пост .
5) Я также думаю, что вы хотели напечатать a
и поэтому заменили $$v
на $$a
.
Итак, в целом, это работает отлично, если у вас есть / bin / bash:
SHELL:=/bin/bash
.ONESHELL:
.PHONY: runners
apps:=app2 app3 app1 app5
runners:
@for a in $(apps) ; do <<-- ; between commands as usual
if [[ "$$a" == "app1" ]]; then
echo first: $$a <<-- no need for ; because of .ONESHELL
else
echo second: $$a
fi
done
Вывод:
second: app2
second: app3
first: app1
second: app5