So rufen Sie eine Benutzerumgebungsvariable in CMake (Windows) ab

103

Ich weiß, wie man eine normale maschinenweite Umgebungsvariable in CMAKE mit abruft

$ENV{EnvironmentVariableName}

Ich kann jedoch keine benutzerspezifische Umgebungsvariable abrufen. Ist es möglich und wie?

Lars Bilke
quelle
2
Ich denke, Sie sollten diese Frage einfach löschen, da sie mit der angegebenen Antwort nichts hinzufügt.
Tom Brito
11
Dies ist der erste Google-Treffer zum Abrufen von Umgebungsvariablen in CMake. Es mag etwas seltsam sein, dass die Frage bereits die Antwort enthält, aber IMO sollte sie nicht gelöscht werden.
Andreas Haferburg
2
Wie zum Teufel hat diese Frage und Antwort so viele positive Stimmen, wenn die Antwort total "nichts" ist?
Ludwik
3
@Ludwik, weil es das Problem löst, dass benutzerspezifische Umgebungsvariablen in CMake-Skripten nicht verfügbar sind.
Robert
3
Ein Teil des Problems besteht darin, dass die Aufteilung zwischen "benutzerspezifischen Umgebungsvariablen" und "normalen maschinenweiten Umgebungsvariablen" ein Konzept ist, das für Windows sehr spezifisch ist. Unix-ähnlichen Systemen ist es egal, wo Umgebungsvariablen festgelegt sind. Sie sind alle gleich.
James Moore

Antworten:

82

Variablen in Ihr CMake-Skript aufnehmen

Sie können eine Variable in der Zeile mit dem cmake-Aufruf übergeben:

FOO=1 cmake

oder durch Exportieren einer Variablen in BASH:

export FOO=1

Dann können Sie es in einem cmake-Skript abrufen, indem Sie:

$ENV{FOO}
Cameron Lowell Palmer
quelle
13

Sie können auch aufrufen selbst, um dies plattformübergreifend zu tun:

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

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

Führen Sie den Befehl in einer geänderten Umgebung aus.


Beachten Sie jedoch, dass dies möglicherweise nur beim ersten Mal funktioniert. Wenn CMake mit einem der aufeinanderfolgenden Builds neu konfiguriert wird (Sie rufen einfach z. B. makeeinen CMakeLists.txtauf, der geändert wurde und CMake den Generierungsprozess erneut durchläuft), ist die benutzerdefinierte Umgebungsvariable möglicherweise nicht mehr vorhanden (im Vergleich zu systemweiten Umgebungsvariablen).

Daher übertrage ich diese benutzerdefinierten Umgebungsvariablen in meinen Projekten in eine zwischengespeicherte CMake-Variable:

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}")

Referenz

Florian
quelle
4

Sie müssen Ihre Variablen exportieren lassen. So zum Beispiel unter Linux:

export EnvironmentVariableName=foo

Nicht exportierte Variablen sind in CMAKE leer.

P51DAce
quelle
5
Sie müssen sie nicht exportieren! Beispiel: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), Aufruf : COVERAGE=1 cmake ... Zugegeben, ich überprüfe den Inhalt nicht und weiß nicht, ob es so wäre. Aber es funktioniert auf jeden Fall zum Testen, ob es definiert ist oder nicht!
Janus Troelsen
1
Wenn Sie Variablen in vorherigen Zeilen definieren, benötigen Sie den Export. Nur Variablen, die in derselben Zeile definiert sind, erfordern keinen Export, aber die Frage, auf die wir nicht schließen können, ob Sie dies auf die eine oder andere Weise tun.
Alexis Wilke
1

Umgebungsvariablen (die Sie mithilfe der Systemeigenschaften ändern) werden nur dann an Subshells weitergegeben, wenn Sie eine neue Subshell erstellen.

Wenn beim Ändern der Benutzerumgebungsvariablen eine Eingabeaufforderung (DOS oder Cygwin) geöffnet war, werden diese nicht angezeigt.

Sie müssen eine neue Eingabeaufforderung öffnen, nachdem Sie die Benutzereinstellungen geändert haben.

Das Äquivalent in Unix / Linux ist das Hinzufügen einer Zeile zu Ihrer .bash_rc: Sie müssen eine neue Shell starten, um die Werte zu erhalten.

Mark Lakata
quelle
Unter Windows können Sie SET var_name=var_valuedie Umgebungsvariable auch in der aktuellen DOS-Sitzung oder SETX var_name var_valuedauerhaft festlegen : siehe set und setx . set local könnte auch interessant sein.
WillC
Unter Unix / Linux können Sie im Allgemeinen auch ausführen source ~/.bashrc, um die geänderte .bashrcDatei erneut auszuführen und die neuen Werte in Ihre aktuelle Sitzung zu übernehmen.
WillC