Cómo recuperar una variable de entorno de usuario en CMake (Windows)

104

Sé cómo recuperar una variable de entorno normal en toda la máquina en CMAKE usando

$ENV{EnvironmentVariableName}

pero no puedo recuperar una variable de entorno específica del usuario. ¿Es posible y como?

Lars Bilke
fuente
2
Creo que debería eliminar esta pregunta, ya que no agrega nada con la respuesta dada.
Tom Brito
11
Este es el primer éxito de Google sobre cómo recuperar variables de entorno en CMake. Puede ser un poco extraño que la pregunta ya contenga la respuesta, pero no debería eliminarse en mi opinión.
Andreas Haferburg
2
¿Cómo diablos esta pregunta y respuesta tienen tantos votos a favor, cuando la respuesta es totalmente "nada"?
Ludwik
3
@Ludwik porque responde al problema de que las variables de entorno específicas del usuario no están disponibles en los scripts de CMake.
Robert
3
Parte del problema es que la división entre "variables de entorno específicas del usuario" y "variables de entorno normales de toda la máquina" es un concepto muy específico de Windows. A los sistemas similares a Unix no les importa dónde se establecen las variables de entorno; son todos iguales.
James Moore

Respuestas:

83

Obtener variables en su script de CMake

Puede pasar una variable en la línea con la invocación de cmake:

FOO=1 cmake

o exportando una variable en BASH:

export FOO=1

Luego puede recogerlo en un script de cmake usando:

$ENV{FOO}
Cameron Lowell Palmer
fuente
13

También puede invocar sí mismo para hacer esto de una manera multiplataforma:

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

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

Ejecute el comando en un entorno modificado.


Solo tenga en cuenta que es posible que esto solo funcione la primera vez. Si CMake se reconfigura con una de las compilaciones consecutivas (solo llama make, por ejemplo , CMakeLists.txtse cambió una y CMake se ejecuta nuevamente en el proceso de generación), es posible que la variable de entorno definida por el usuario ya no esté allí (en comparación con las variables de entorno del sistema).

Así que transfiero esas variables de entorno definidas por el usuario en mis proyectos a una variable en caché de 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}")

Referencia

Florian
fuente
4

Necesita exportar sus variables. Entonces, por ejemplo en Linux:

export EnvironmentVariableName=foo

Las variables no exportadas están vacías en CMAKE.

P51DAce
fuente
5
¡No tienes que exportarlos! Ejemplo: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), invocación: COVERAGE=1 cmake ... Por supuesto, no verifico el contenido y no sé si lo haría. ¡Pero ciertamente funciona para probar si está definido o no!
Janus Troelsen
1
Si define variables en líneas anteriores, entonces necesita la exportación. Solo las variables definidas en la misma línea no requieren la exportación, pero la pregunta no la podemos inferir si lo hace de una forma u otra.
Alexis Wilke
1

Las variables de entorno (que modifica mediante las Propiedades del sistema) solo se propagan a las subcapas cuando crea una nueva subcapa.

Si tenía un indicador de línea de comandos (DOS o cygwin) abierto cuando cambió las variables de entorno de usuario, entonces no aparecerán.

Debe abrir una nueva línea de comandos después de cambiar la configuración del usuario.

El equivalente en Unix / Linux es agregar una línea a su .bash_rc: necesita iniciar un nuevo shell para obtener los valores.

Mark Lakata
fuente
Para Windows, también puede ejecutar SET var_name=var_valuepara configurar la variable de entorno en la sesión actual de DOS, o SETX var_name var_valuepara configurarla permanentemente: consulte set y setx . establecer local también puede ser interesante.
WillC
Para Unix / Linux, generalmente también puede ejecutar source ~/.bashrcpara volver a ejecutar el .bashrcarchivo modificado y obtener los nuevos valores en su sesión actual.
WillC