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.
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