Comment récupérer une variable d'environnement utilisateur dans CMake (Windows)

104

Je sais comment récupérer une variable d'environnement normale à l'échelle de la machine dans CMAKE en utilisant

$ENV{EnvironmentVariableName}

mais je ne peux pas récupérer une variable d'environnement spécifique à l'utilisateur. Est-ce possible et comment?

Lars Bilke
la source
2
Je pense que vous devriez simplement supprimer cette question, car elle n'ajoute rien à la réponse donnée.
Tom Brito
11
C'est le premier hit de Google sur la façon de récupérer les variables d'environnement dans CMake. Il peut être un peu étrange que la question contienne déjà la réponse, mais elle ne devrait pas être supprimée de l'OMI.
Andreas Haferburg
2
Comment diable cette question et cette réponse ont-elles autant de votes positifs, alors que la réponse est totalement «rien»?
Ludwik
3
@Ludwik car il répond au problème que les variables d'environnement spécifiques à l'utilisateur ne sont pas disponibles dans les scripts CMake.
Robert
3
Une partie du problème est que la séparation entre «variables d'environnement spécifiques à l'utilisateur» et «variable d'environnement normale à l'échelle de la machine» est un concept très spécifique à Windows. Les systèmes de type Unix ne se soucient pas de l'emplacement des variables d'environnement; ils sont tous pareils.
James Moore

Réponses:

83

Obtenir des variables dans votre script CMake

Vous pouvez passer une variable sur la ligne avec l'invocation cmake:

FOO=1 cmake

ou en exportant une variable en BASH:

export FOO=1

Ensuite, vous pouvez le récupérer dans un script cmake en utilisant:

$ENV{FOO}
Cameron Lowell Palmer
la source
13

Vous pouvez également invoquer lui-même pour le faire de manière multiplateforme:

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

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

Exécutez la commande dans un environnement modifié.


Juste être conscient que cela ne peut fonctionner que la première fois. Si CMake se reconfigure avec l'une des versions consécutives (vous appelez simplement make, par exemple , une a CMakeLists.txtété modifiée et CMake exécute à nouveau le processus de génération), la variable d'environnement définie par l'utilisateur peut ne plus être là (par rapport aux variables d'environnement à l'échelle du système).

Je transfère donc ces variables d'environnement définies par l'utilisateur dans mes projets dans une variable mise en cache 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}")

Référence

Florian
la source
4

Vous devez exporter vos variables. Donc par exemple sous Linux:

export EnvironmentVariableName=foo

Les variables non exportées sont vides dans CMAKE.

P51DAce
la source
5
Vous n'êtes pas obligé de les exporter! Exemple: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), invocation: COVERAGE=1 cmake ... Certes, je ne vérifie pas le contenu et je ne sais pas si ce serait le cas. Mais cela fonctionne certainement pour tester s'il est défini ou non!
Janus Troelsen
1
Si vous définissez des variables sur les lignes précédentes, vous avez besoin de l'exportation. Seules les variables définies sur la même ligne ne nécessitent pas l'exportation, mais la question ne permet pas de déduire si vous le faites dans un sens ou dans l'autre.
Alexis Wilke
1

Les variables d'environnement (que vous modifiez à l'aide des propriétés système) ne sont propagées aux sous-shell que lorsque vous créez un nouveau sous-shell.

Si vous aviez une invite de ligne de commande (DOS ou cygwin) ouverte lorsque vous avez modifié les variables d'environnement utilisateur, elles n'apparaîtront pas.

Vous devez ouvrir une nouvelle invite de ligne de commande après avoir modifié les paramètres utilisateur.

L'équivalent sous Unix / Linux est d'ajouter une ligne à votre .bash_rc: vous devez démarrer un nouveau shell pour obtenir les valeurs.

Mark Lakata
la source
Pour Windows, vous pouvez également exécuter SET var_name=var_valuepour définir la variable d'environnement dans la session DOS en cours, ou SETX var_name var_valuepour la définir de manière permanente: voir set et setx . set local peut également être intéressant.
WillC
Pour Unix / Linux, vous pouvez aussi généralement exécuter source ~/.bashrcpour réexécuter le .bashrcfichier modifié et obtenir les nouvelles valeurs dans votre session actuelle.
WillC