Як отримати змінну середовища користувача в CMake (Windows)


104

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

$ENV{EnvironmentVariableName}

але я не можу отримати змінну середовища для користувача. Чи можливо і як?


2
Я думаю, що вам слід просто видалити це запитання, оскільки воно нічого не додає до даної відповіді.
Том Бріто

11
Це перший хіт Google про те, як отримати VRS середовища в CMake. Це може бути трохи дивно, що питання вже містить відповідь, але його не слід видаляти ІМО.
Андреас Хафербург

2
Як, на біса, на це питання і відповідь так багато відгуків, коли відповідь абсолютно "нічого"?
Людвік

3
@Ludwik, оскільки він відповідає на проблему, що змінні специфічного середовища для користувача недоступні в сценаріях CMake.
Роберт

3
Частина проблеми полягає в тому, що розкол між "змінними для певного середовища" та "звичайними змінними для машинного середовища" - це концепція, дуже специфічна для Windows. Unix-подібним системам не важливо, де встановлені змінні середовища; вони всі однакові.
Джеймс Мур

Відповіді:


83

Отримання змінних у ваш сценарій CMake

Ви можете передавати змінну на рядок із викликом cmake:

FOO=1 cmake

або експортуючи змінну в BASH:

export FOO=1

Потім ви можете забрати його у сценарії cmake, використовуючи:

$ENV{FOO}

13

Ви також можете викликати Сам це робити крос-платформним способом:

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 ... Зрозуміло, я не перевіряю вміст, і не знаю, чи це було б. Але це, безумовно, працює для тестування, визначається чи ні!
Янус Троельсен

1
Якщо ви визначаєте змінні в попередніх рядках, тоді вам потрібен експорт. Лише змінні, визначені в одному рядку, не вимагають експорту, але питання, яке ми не можемо зробити, ми можемо зробити висновок, чи це ви робите так чи інакше
Алексіс Вілке

1

Змінні середовища (які ви модифікуєте за допомогою властивостей системи) поширюються на підпакети лише при створенні нової підшалі.

Якщо у вас було відкрито підказку командного рядка (DOS або cygwin) під час зміни користувальницьких середовищ, вони не з’являться.

Після зміни налаштувань користувача потрібно відкрити новий командний рядок.

Еквівалент в Unix / Linux - це додавання рядка до вашого .bash_rc: для отримання значень потрібно запустити нову оболонку.


Для Windows також можна запустити, SET var_name=var_valueщоб встановити змінну середовища в поточному сеансі DOS або SETX var_name var_valueпостійно встановити її: див. Set та setx . Набір місцевих також може бути цікавим.
WillC

Для Unix / Linux можна також запустити source ~/.bashrcповторний запуск зміненого .bashrcфайлу та отримати нові значення у поточний сеанс.
WillC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.