Jak pobrać zmienną środowiskową użytkownika w CMake (Windows)


104

Wiem, jak pobrać normalną zmienną środowiskową dla całej maszyny w CMAKE przy użyciu

$ENV{EnvironmentVariableName}

ale nie mogę pobrać zmiennej środowiskowej specyficznej dla użytkownika. Czy to możliwe i jak?


2
Myślę, że powinieneś po prostu usunąć to pytanie, ponieważ nic nie dodaje do podanej odpowiedzi.
Tom Brito,

11
To jest pierwsze trafienie Google na temat pobierania zmiennych środowiskowych w CMake. To może być trochę dziwne, że pytanie zawiera już odpowiedź, ale nie powinno być usuwane IMO.
Andreas Haferburg

2
Jak, do diabła, to pytanie i odpowiedź mają tyle pozytywnych głosów, skoro odpowiedź brzmi „nic”?
Ludwik

3
@Ludwik, ponieważ rozwiązuje problem polegający na tym, że zmienne środowiskowe specyficzne dla użytkownika nie są dostępne w skryptach CMake.
Robert

3
Po części problem polega na tym, że podział na „zmienne środowiskowe specyficzne dla użytkownika” i „normalne zmienne środowiskowe dla całego komputera” jest pojęciem bardzo specyficznym dla systemu Windows. Systemy uniksowe nie dbają o to, gdzie ustawiane są zmienne środowiskowe; wszystkie są takie same.
James Moore

Odpowiedzi:


83

Pobieranie zmiennych do skryptu CMake

Możesz przekazać zmienną w linii z wywołaniem cmake:

FOO=1 cmake

lub eksportując zmienną w BASH:

export FOO=1

Następnie możesz go odebrać w skrypcie cmake za pomocą:

$ENV{FOO}

13

Możesz także wywołać zrobić to w sposób wieloplatformowy:

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

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

Uruchom polecenie w zmodyfikowanym środowisku.


Wystarczy mieć świadomość , że to może działać tylko za pierwszym razem. Jeśli CMake ponownie konfiguruje się z jedną z kolejnych kompilacji (po prostu wywołujesz, na przykład make, jedna CMakeLists.txtzostała zmieniona i CMake ponownie przechodzi przez proces generowania), zmienna środowiskowa zdefiniowana przez użytkownika może już nie istnieć (w porównaniu ze zmiennymi środowiskowymi całego systemu).

Więc przenoszę te zmienne środowiskowe zdefiniowane przez użytkownika w moich projektach do zmiennej buforowanej 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}")

Odniesienie


4

Musisz wyeksportować zmienne. Na przykład w Linuksie:

export EnvironmentVariableName=foo

Niewyeksportowane zmienne są puste w CMAKE.


5
Nie musisz ich eksportować! Przykład: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), wezwanie: COVERAGE=1 cmake ... To prawda, nie sprawdzam zawartości i nie wiem, czy tak. Ale z pewnością działa w testach, jeśli jest zdefiniowany, czy nie!
Janus Troelsen

1
Jeśli zdefiniujesz zmienne w poprzednich wierszach, potrzebujesz eksportu. Tylko zmienne zdefiniowane w tej samej linii nie wymagają eksportu, ale nie możemy wywnioskować, czy robisz to w ten czy inny sposób.
Alexis Wilke

1

Zmienne środowiskowe (modyfikowane przy użyciu właściwości systemu) są propagowane tylko do podpowłok podczas tworzenia nowej podpowłoki.

Jeśli masz otwarty wiersz poleceń (DOS lub cygwin) po zmianie zmiennych środowiska użytkownika, nie pojawią się.

Po zmianie ustawień użytkownika musisz otworzyć nowy wiersz polecenia.

Odpowiednikiem w systemie Unix / Linux jest dodanie linii do twojego .bash_rc: musisz uruchomić nową powłokę, aby uzyskać wartości.


W systemie Windows możesz również uruchomić, SET var_name=var_valueaby ustawić zmienną środowiskową w bieżącej sesji DOS lub SETX var_name var_valueustawić ją na stałe: zobacz set i setx . set local może być również interesujący.
WillC

W przypadku systemów Unix / Linux możesz również ogólnie uruchomić source ~/.bashrcponownie zmodyfikowany .bashrcplik i pobrać nowe wartości do bieżącej sesji.
WillC
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.