Come recuperare una variabile di ambiente utente in CMake (Windows)


104

So come recuperare una normale variabile di ambiente a livello di macchina in CMAKE utilizzando

$ENV{EnvironmentVariableName}

ma non riesco a recuperare una variabile di ambiente specifica dell'utente. È possibile e come?


2
Penso che dovresti semplicemente eliminare questa domanda, poiché non aggiunge nulla alla risposta data.
Tom Brito

11
Questo è il primo successo di Google su come recuperare le variabili di ambiente in CMake. Potrebbe essere un po 'strano che la domanda contenga già la risposta, ma non dovrebbe essere eliminata IMO.
Andreas Haferburg

2
Come diavolo questa domanda e risposta hanno così tanti voti positivi, quando la risposta è totalmente "niente"?
Ludwik

3
@Ludwik perché risponde al problema che le variabili di ambiente specifiche dell'utente non sono disponibili negli script CMake.
Robert,

3
Parte del problema è che la divisione tra "variabili di ambiente specifiche dell'utente" e "normale variabile di ambiente a livello di macchina" è un concetto molto specifico di Windows. I sistemi Unix non si preoccupano di dove sono impostate le variabili d'ambiente; sono tutti uguali.
James Moore

Risposte:


83

Inserimento di variabili nello script CMake

Puoi passare una variabile sulla riga con l'invocazione cmake:

FOO=1 cmake

o esportando una variabile in BASH:

export FOO=1

Quindi puoi prenderlo in uno script cmake usando:

$ENV{FOO}

13

Puoi anche invocare stesso per farlo in modo multipiattaforma:

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

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

Esegui il comando in un ambiente modificato.


Basta essere consapevoli che questo potrebbe funzionare solo la prima volta. Se CMake si riconfigura con una delle build consecutive (si chiama ad esempio make, una è CMakeLists.txtstata modificata e CMake esegue nuovamente il processo di generazione), la variabile di ambiente definita dall'utente potrebbe non essere più presente (rispetto alle variabili di ambiente a livello di sistema).

Quindi trasferisco quelle variabili di ambiente definite dall'utente nei miei progetti in una variabile memorizzata nella 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}")

Riferimento


4

Devi esportare le tue variabili. Quindi, ad esempio in Linux:

export EnvironmentVariableName=foo

Le variabili non esportate sono vuote in CMAKE.


5
Non devi esportarli! Esempio: CMakeLists.txt IF($ENV{COVERAGE}) ... END(), invocazione: COVERAGE=1 cmake ... Certo, non controllo il contenuto e non so se lo farebbe. Ma sicuramente funziona per testare se è definito o no!
Janus Troelsen

1
Se si definiscono variabili nelle righe precedenti, è necessaria l'esportazione. Solo le variabili definite sulla stessa riga non richiedono l'esportazione, ma dalla domanda non possiamo dedurre se lo fai in un modo o nell'altro.
Alexis Wilke

1

Le variabili di ambiente (modificate utilizzando le proprietà del sistema) vengono propagate alle subshell solo quando si crea una nuova subshell.

Se avevi un prompt della riga di comando (DOS o cygwin) aperto quando hai modificato le variabili env utente, non verranno visualizzate.

È necessario aprire un nuovo prompt della riga di comando dopo aver modificato le impostazioni utente.

L'equivalente in Unix / Linux è l'aggiunta di una riga al tuo .bash_rc: devi avviare una nuova shell per ottenere i valori.


Per Windows puoi anche eseguire SET var_name=var_valueper impostare la variabile d'ambiente nella sessione DOS corrente, o SETX var_name var_valueper impostarla in modo permanente: vedi set e setx . anche impostare locale potrebbe essere interessante.
WillC

Per Unix / Linux puoi anche eseguire generalmente source ~/.bashrcper rieseguire il .bashrcfile modificato e ottenere i nuovi valori nella sessione corrente.
WillC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.