Книга: Разработка приложений в среде Linux. Второе издание
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.о
- Системные переменные ROWS_AFFECTED, GDSCODE, SQLCODE, TRANSACTIONJD, CONNECTIONJD
- 1.2.3. Константы, переменные и типы
- 22.3.3. Переменные окружения
- 8.3 Этап 3: переменные с произвольными именами; встроенные функции
- Контекстные переменные даты и времени
- 13.2.4. Условные переменные
- Переменные
- 15.4.2.1. Добавляйте отладочные опции и переменные
- Глава 2 Аргументы, опции и переменные окружения
- 2.4. Переменные окружения
- 1.3. Переменные
- 13.2.1. Категории локалей и переменные окружения