2016-01-27 9 views
15

Forse mi manca qualcosa di ovvio, ma non riesco a capire come impostare in modo esplicito le variabili di ambiente che possono essere viste dai processi avviati attraverso add_custom_target().Come modificare le variabili di ambiente passate al target CMake personalizzato?

ho provato la seguente:

set(ENV{PATH} "C:/Some/Path;$ENV{PATH}") 
add_custom_target(newtarget somecommand) 

Purtroppo, la variabile d'ambiente %PATH% appare invariato a somecommand. (Ho creato un Gist che riproduce il problema here.)

Cosa sto facendo male?

+0

Suggerirei che, poiché si sta creando un nuovo processo (dai commenti), al nuovo processo verrà fornito il proprio ambiente, non ereditato l'ambiente del processo principale. Se crei un processo figlio del processo principale, allora l'ambiente dovrebbe essere ereditato, ma non so nulla di 'cmake', quindi potrei essere lontano da qui. Dovresti comunque usare 'backslash' come separatori di directory, non'/'come'/'è un prefisso di commutazione. A volte '/' funziona felicemente, ma non è affidabile. – Magoo

risposta

13

Un modo portatile di impostare variabili d'ambiente per un target personalizzato è quello di utilizzare CMake del comando modalità riga di comando strumento env:

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]... 
Run command in a modified environment. 

Es .:

add_custom_target(newtarget ${CMAKE_COMMAND} -E env NAME=VALUE somecommand) 

vedere anche Command Line Tool Mode.

12

si imposta variabile di ambiente al configurazione passo, ma per il comando specificato add_custom_target viene eseguito al accumulo passo. Vedi anche CMake FAQ: How can I get or set environment variables?

[...]
variabili d'ambiente SET nel CMakeLists.txt solo agire per CMake sé (configure-tempo), quindi non è possibile utilizzare questo metodo per impostare una variabile di ambiente che potrebbe essere necessario un comando personalizzato (build-time). Supporto variabile di ambiente di limitazione tramite vari comandi di CMake (ad esempio add_custom_command(), attualmente non ancora supportato), una soluzione accettabile potrebbe essere quella di richiamare gli script di shell invece che eseguono il wrap dei comandi da eseguire.

Attualmente add_custom_target (e altri comandi, che definiscono le azioni per passaggio di generazione, ad esempio add_custom_command) non supporta semplici variabili di ambiente impostazione. Come consigliato in this bugreport, per il valore della variabile impostata senza spazi su Linux è possibile anteporre il comando con le clausole "VAR = VAL". Per i casi generali si può preparare involucro script, che messe a punto l'ambiente ed eseguire il comando effettivo:

Su Windows:

wrapper.bat:

@ECHO OFF 
set PATH="C:\\Some\\Path;%PATH%" 
%* 

CMakeLists.txt:

add_custom_target(... 
    COMMAND cmd /c ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.bat <real_command> args... 
) 

O n Linux:

wrapper.sh:

export "PATH=/Some/Path:$PATH" 
eval "$*" 

CMakeLists.txt:

add_custom_target(... 
    COMMAND /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh <real_command> args... 
) 

Se valore della variabile dipende dalla configurazione, è possibile configurare script wrapper con configure_file.

UPDATE:

Come notato da @sakra, env Modalità strumento di cmake eseguibile può essere utilizzato come script involucro:

add_custom_target(... 
    COMMAND ${CMAKE_COMMAND} -E env "PATH=C:/Some/Path;$ENV{PATH}" <real_command> args... 
) 

questo modo è Disponibile da CMake 3.2.