Во-первых, каждая строка рецепта запускается в своей собственной оболочке, как упоминал @JonathanLeffler.Каждый раз, когда оболочка закрывается, она забывает обо всех своих переменных (для этого есть несколько веских причин безопасности).Таким образом, переменная, установленная в одной строке рецепта, не может быть доступна на следующей строке.Один из наиболее распространенных способов обойти это - использовать только одну строку для вашего рецепта.Я должен отметить, что вы также используете $(CFLAGS)
, чтобы попытаться сослаться на переменную bash.Make расширит $(CFLAGS)
до внутренней переменной, даже не передав ее в bash, поэтому в вашем примере вы даже не используете переменную bash.
Для иллюстрации:
foo:
@SOMEVAR=hello; \
echo $@:$$SOMEVAR
bar:
@SOMEVAR=hello;
@echo $@:$$SOMEVAR
MAKEVAR:=goodbye
foobar:
@echo "$@:$(MAKEVAR)"
Тогда вы получите:
tmp> make foo bar foobar
foo:hello
bar:
foobar:goodbye
обратите внимание на ';'и '\' в конце первой строки рецепта foo
.\
объединяет две строки рецепта в одну, а ;
указывает bash запускаться как две отдельные команды.Также обратите внимание на отсутствие символа @
во второй строке, так как bash не понимает @
.Наконец, обратите внимание, что в рецепте foobar
перед переменной make есть только один $
, что означает, что он расширяется make-файлом, но два $$
перед foo
и bar
варианты (которые расширяются до одного $
перед передачей в bash).