Как получить переменную среды пользователя в 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.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.