Я вижу, что вы пошли взад-вперед, поэтому позвольте мне сделать комментарий, который может или не может помочь.
Как правило, вы не пишете циклы внутри make recipes, потому что make самобеспечивает "зацикливание".Поэтому, когда вы пишете правило вроде:
all: app1 app2 app3 app4
, make будет пытаться создать каждую из этих предпосылок, по одной за раз.Поэтому, если вы хотите иметь make-файл, который отображает строку для каждой записи в переменной apps
, вы должны сделать это так:
all: $(apps)
$(apps):
@echo $@
Это говорит make, чтобы начать с цели all
и попробовать«построить» каждое из его предварительных условий, которые являются значениями в переменной apps
.
Затем вы определяете правило для того, как создавать приложения, и для каждого вы говорите, что это правило echo $@
где $@
- это автоматическая переменная , которая расширяется до цели, создаваемой в настоящее время.
В make синтаксис:
foo bar biz:
some command
сокращен и идентиченto, написание:
foo:
some command
bar:
some command
biz:
some command
Важная вещь при написании make-файлов заключается в том, что вы думаете, как написать правило для создания одного файла (цели) из нуля или более необходимых файлов.Затем вы позволите себе позаботиться о том, как соединить все эти предпосылки вместе и правильно их упорядочить.
ETA Если вам нужно специальное правило для одной конкретной цели в длинном списке, хранящемся в $(apps)
переменная, вы можете сделать это:
$(filter-out bar,$(apps)):
@echo print $@
bar:
some other command