В CMake с переменными окружения можно работать напрямую в CMakeLists.txt — читать, устанавливать и проверять их наличие. Вот основные способы и важные нюансы.
[Чтение и проверка переменных окружения]
Для чтения переменных окружения в CMake используется синтаксис `$ENV{VAR_NAME}`.
# Вывести значение переменной HOME
message(STATUS "Home directory: $ENV{HOME}")
Чтобы проверить, определена ли переменная, используйте команду `if(DEFINED ENV{...})`:
# Проверка существования переменной
if(DEFINED ENV{MY_VARIABLE})
message(STATUS "MY_VARIABLE is set to: $ENV{MY_VARIABLE}")
else()
message(WARNING "MY_VARIABLE is not set.")
endif()
Альтернативный способ — проверить, не является ли значение переменной пустой строкой:
if(NOT "$ENV{MY_VARIABLE}" STREQUAL "")
message(STATUS "MY_VARIABLE has a value: $ENV{MY_VARIABLE}")
endif()
[Установка и удаление переменных]
Установить переменную окружения на время выполнения CMake можно с помощью `set(ENV{...})`:
# Установить переменную
set(ENV{MY_VARIABLE} "my_value")
Удалить переменную можно с помощью `unset()`:
# Удалить переменную
unset(ENV{MY_VARIABLE})
Важно: установленные таким способом переменные действуют только в процессе CMake и не влияют на систему или вызывающую оболочку.
[Практическое применение: условная логика и значения по умолчанию]
Переменные окружения удобно использовать для условной логики в сборке. Например, можно установить значение по умолчанию, если переменная не определена:
# Установить значение по умолчанию, если переменная окружения не задана
if(NOT DEFINED ENV{BUILD_TYPE})
set(BUILD_TYPE "Release")
else()
set(BUILD_TYPE "$ENV{BUILD_TYPE}")
endif()
message(STATUS "Build type: ${BUILD_TYPE}")
Или управлять флагами компиляции:
# Включить отладочный режим на основе переменной окружения
if(DEFINED ENV{ENABLE_DEBUG} AND "$ENV{ENABLE_DEBUG}" STREQUAL "1")
add_compile_definitions(-DDEBUG)
message(STATUS "Debug mode enabled")
endif()
[Важные ограничения и предупреждения]
1. Область видимости: переменные, установленные через `set(ENV{...})`, видны только в текущем процессе CMake (на этапе конфигурации) и не передаются в целевые программы (исполняемые файлы) при их запуске.
2. Этап сборки (Build Time): переменные, установленные во время конфигурации (вызова `cmake`), **не передаются автоматически** командам сборки (например, внутри `add_custom_command()`). Для этого нужно использовать аргументы команды или другие методы.
3. Отсутствие отслеживания изменений: CMake не отслеживает изменения переменных окружения. Если вы измените переменную в оболочке и повторно запустите сборку (`cmake --build`), CMake не переконфигурируется автоматически. Чтобы изменения вступили в силу, необходимо повторно запустить конфигурацию (`cmake`).