Como recuperar uma variável de ambiente do usuário no CMake (Windows)

104

Eu sei como recuperar uma variável de ambiente normal de toda a máquina no CMAKE usando

$ENV{EnvironmentVariableName}

mas não consigo recuperar uma variável de ambiente específica do usuário. É possível e como?

Lars Bilke
fonte
2
Acho que você deve apenas excluir esta questão, pois não acrescenta nada com a resposta dada.
Tom Brito de
11
Este é o primeiro sucesso do Google sobre como recuperar vars de ambiente no CMake. Pode ser um pouco estranho que a pergunta já contenha a resposta, mas ela não deve ser excluída IMO.
Andreas Haferburg
2
Como diabos essa pergunta e resposta têm tantos votos positivos, quando a resposta é totalmente "nada"?
Ludwik
3
@Ludwik porque responde ao problema de que as variáveis ​​de ambiente específicas do usuário não estão disponíveis nos scripts CMake.
Robert,
3
Parte do problema é que a divisão entre "variáveis ​​de ambiente específicas do usuário" e "variável de ambiente normal da máquina" é um conceito muito específico do Windows. Sistemas tipo Unix não se importam onde as variáveis ​​de ambiente são definidas; eles são todos iguais.
James Moore de

Respostas:

83

Obtendo variáveis ​​em seu script CMake

Você pode passar uma variável na linha com a invocação cmake:

FOO=1 cmake

ou exportando uma variável no BASH:

export FOO=1

Então você pode pegá-lo em um script cmake usando:

$ENV{FOO}
Cameron Lowell Palmer
fonte
13

Você também pode invocar para fazer isso de uma forma multiplataforma:

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

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

Execute o comando em um ambiente modificado.


Esteja ciente de que isso pode funcionar apenas na primeira vez. Se o CMake for reconfigurado com um dos builds consecutivos (você apenas chama make, por exemplo , um CMakeLists.txtfoi alterado e o CMake executa o processo de geração novamente), a variável de ambiente definida pelo usuário pode não estar mais lá (em comparação com as variáveis ​​de ambiente do sistema).

Então, eu transfiro essas variáveis ​​de ambiente definidas pelo usuário em meus projetos para uma variável em 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}")

Referência

Florian
fonte
4

Você precisa ter suas variáveis ​​exportadas. Por exemplo, no Linux:

export EnvironmentVariableName=foo

Variáveis ​​não exportadas estão vazias no CMAKE.

P51DAce
fonte
5
Você não precisa exportá-los! Exemplo: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), invocação: COVERAGE=1 cmake ... Concedido, não verifico o conteúdo e não sei se faria. Mas certamente funciona para testar se está definido ou não!
Janus Troelsen de
1
Se você definir variáveis ​​nas linhas anteriores, precisará exportar. Apenas variáveis ​​definidas na mesma linha não requerem a exportação, mas a questão não podemos inferir se você faz isso de uma forma ou de outra.
Alexis Wilke
1

Variáveis ​​de ambiente (que você modifica usando as Propriedades do sistema) são propagadas apenas para subshells quando você cria um novo subshell.

Se você tinha um prompt de linha de comando (DOS ou cygwin) aberto quando alterou os vars env do usuário, eles não aparecerão.

Você precisa abrir um novo prompt de linha de comando após alterar as configurações do usuário.

O equivalente em Unix / Linux é adicionar uma linha ao seu .bash_rc: você precisa iniciar um novo shell para obter os valores.

Mark Lakata
fonte
Para Windows, você também pode executar SET var_name=var_valuepara definir a variável de ambiente na sessão DOS atual ou SETX var_name var_valuepara defini-la permanentemente: consulte set e setx . definir local também pode ser interessante.
WillC
Para Unix / Linux, você também pode geralmente executar source ~/.bashrcpara executar novamente o .bashrcarquivo modificado e obter os novos valores em sua sessão atual.
WillC