4.2.2. Переменные
4.2.2. Переменные
Часто бывает необходимо определить только один компонент переменной за раз. Можно написать, например, такой код:
OBJS = foo.о
OBJS = $(OBJS) bar.о
OBJS = $(OBJS) baz.о
Ожидается, что здесь OBJS будет определен как foo.о bar.о baz.о, но в действительности он определен как $(OBJS) baz.о, поскольку make не разворачивает переменные до момента их использования[4]. При ссылке в правиле на OBJS make войдет в бесконечный цикл[5]. Во избежание этого во многих make-файлах разделы организуются следующим образом:
OBJS1 = foo.о
OBJS2 = bar.о
OBJS3 = baz.о
OBJS = $(OBJS1) $(OBJS2) $(OBJS3)
Объявления переменных вроде предыдущего встречаются, когда объявление одной переменной оказывается слишком длинным и потому не удобным.
Развертывание переменной вызывает типичный вопрос, который программист в Linux должен решить. Инструменты GNU, распространяемые с Linux, обычно более функциональны, чем версии инструментов, включенных в другие системы, и GNU make — не исключение. Авторы GNU make предусмотрели альтернативный способ присваивания переменных, но не все версии make понимают эти альтернативные формы. К счастью, GNU make можно собрать для любой системы, в которую можно перенести исходный код, написанных под Linux. Существует форма простого присваивания переменных, которая показана ниже.
OBJS := foo.о
OBJS := $(OBJS) bar.о
OBJS := $(OBJS) baz.о
Операция := заставляет GNU make вычислить выражение переменной при присваивании, а не ждать вычисления выражения при его использовании в правиле. В результате выполнения этого кода OBJS действительно получит foo.о bar.о baz.о.
Простое присваивание переменной используется очень часто, но в GNU make есть еще и другой синтаксис присваивания, который позаимствован из языка С:
OBJS := foo.о
OBJS += bar.о
OBJS += baz.о