Как получить переменную среды пользователя в CMake (Windows)

105

Я знаю, как получить обычную переменную среды для всей машины в CMAKE, используя

$ENV{EnvironmentVariableName}

но я не могу получить переменную среды для конкретного пользователя. Возможно ли это и как?

Ларс Бильке
источник
2
Я думаю, вам следует просто удалить этот вопрос, поскольку он ничего не добавляет к данному ответу.
Том Брито
11
Это первая статья Google о том, как получить переменные среды в CMake. Может быть немного странно, что вопрос уже содержит ответ, но его не следует удалять ИМО.
Андреас Хафербург
2
Как, черт возьми, у этого вопроса и ответа так много голосов, когда ответ - «ничего»?
Людвик,
3
@Ludwik, потому что он решает проблему, заключающуюся в том, что пользовательские переменные среды недоступны в сценариях CMake.
Роберт
3
Отчасти проблема заключается в том, что разделение между «переменными среды, специфичными для пользователя» и «переменной среды обычного компьютера» - это концепция, которая очень специфична для Windows. Unix-подобным системам все равно, где установлены переменные среды; они все одинаковые.
Джеймс Мур

Ответы:

83

Получение переменных в вашем скрипте CMake

Вы можете передать переменную в строке с вызовом cmake:

FOO=1 cmake

или путем экспорта переменной в BASH:

export FOO=1

Затем вы можете забрать его в скрипте cmake, используя:

$ENV{FOO}
Кэмерон Лоуэлл Палмер
источник
14

Вы также можете вызвать сам, чтобы сделать это кроссплатформенным способом:

cmake -E env EnvironmentVariableName="Hello World" cmake ..

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...

Запустить команду в измененной среде.


Просто имейте в виду, что это может сработать только в первый раз. Если CMake переконфигурируется с одной из последовательных сборок (вы просто вызываете, например make, одна CMakeLists.txtбыла изменена, и CMake снова запускает процесс генерации), пользовательская переменная среды может больше не присутствовать (по сравнению с общесистемными переменными среды).

Поэтому я переношу эти определенные пользователем переменные среды в свои проекты в кэшированную переменную CMake:

cmake_minimum_required(VERSION 2.6)

project(PrintEnv NONE)

if (NOT "$ENV{EnvironmentVariableName}" STREQUAL "")
    set(EnvironmentVariableName "$ENV{EnvironmentVariableName}" CACHE INTERNAL "Copied from environment variable")
endif()

message("EnvironmentVariableName = ${EnvironmentVariableName}")

Ссылка

Флориан
источник
4

Вам необходимо экспортировать свои переменные. Так, например, в Linux:

export EnvironmentVariableName=foo

Неэкспортированные переменные пусты в CMAKE.

P51DAce
источник
5
Их не нужно экспортировать! Пример: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), вызов: COVERAGE=1 cmake ... Конечно, я не проверяю содержимое, и не знаю, проверял бы это. Но он, безусловно, работает для тестирования, если он определен или нет!
Janus Troelsen
1
Если вы определяете переменные в предыдущих строках, вам нужен экспорт. Только переменные, определенные в одной строке, не требуют экспорта, но вопрос, который мы не можем сделать вывод, сделаете ли вы это так или иначе.
Alexis Wilke
1

Переменные среды (которые вы изменяете с помощью свойств системы) распространяются на подоболочки только при создании новой подоболочки.

Если у вас была открыта командная строка (DOS или cygwin), когда вы изменили переменные окружения пользователя, то они не появятся.

После изменения пользовательских настроек вам необходимо открыть новую строку командной строки.

Эквивалент в Unix / Linux - это добавление строки в ваш .bash_rc: вам нужно запустить новую оболочку, чтобы получить значения.

Марк Лаката
источник
Для Windows вы также можете запустить, SET var_name=var_valueчтобы установить переменную среды в текущем сеансе DOS или SETX var_name var_valueустановить ее постоянно: см. Set и setx . set local тоже может быть интересным.
WillC 04
Для Unix / Linux вы также обычно можете запустить, source ~/.bashrcчтобы повторно запустить измененный .bashrcфайл и получить новые значения в текущем сеансе.
WillC 04