2016-01-27 8 views
15

Być może brakuje mi czegoś oczywistego, ale nie potrafię odgadnąć, jak jawnie ustawić zmienne środowiskowe, które można zobaczyć w procesach uruchamianych przez add_custom_target().Jak modyfikować zmienne środowiskowe przekazywane do niestandardowego CMake targetu?

Próbowałem następujące:

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

Niestety, zmienna Środowisko %PATH% pojawia się na niezmienionym poziomie do somecommand. (Skonfigurowałem Gist, który odtwarza problem. here.)

Co robię źle?

+0

Sugeruję, że od czasu, gdy tworzysz nowy proces (z twoich komentarzy), wówczas nowy proces będzie miał własne środowisko, a nie dziedziczy środowiska głównego procesu. Jeśli utworzysz proces potomny procesu głównego, to środowisko powinno zostać odziedziczone - ale nic nie wiem o "cmake", więc mogę być daleko tutaj. Powinieneś jednak używać 'ukośnika odwrotnego' jako separatorów katalogów, a nie'/'jako'/'jest prefiksem przełączającym. Czasem '/' działa szczęśliwie, ale nie jest niezawodne. – Magoo

Odpowiedz

13

Przenośny sposób ustawiania zmiennych środowiskowych za cel niestandardowego jest użycie CUpewnij Command tryb narzędzie wiersza polecenia env:

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

Np .:

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

zobaczyć również Command Line Tool Mode.

12

ustawić zmienną środowiskową w konfiguracja kroku, lecz podane polecenie dla add_custom_target jest wykonywany w build kroku. Zobacz także CUpewnij FAQ: How can I get or set environment variables?

[...]
zmienne środowiskowe SET w CMakeLists.txt tylko obowiązywać dla cmake samego (Konfiguracja czasu) więc nie można korzystać z tego metoda ustawiania zmiennej środowiskowej, której może wymagać niestandardowe polecenie (czas kompilacji). Obsługa zmiennych środowiska Barring za pomocą różnych poleceń CMake (np. add_custom_command(), obecnie nie jest jeszcze obsługiwana), akceptowalnym sposobem obejścia może być wywołanie skryptów powłoki zamiast , które zawijają polecenia do wykonania.

Obecnie add_custom_target (i innych poleceń, które określają działania na etapie budowy, np add_custom_command) nie ma w prostych zmienne środowiska sieciowego. Zgodnie z zaleceniami pod numerem this bugreport dla wartości zmiennej zestawu bez spacji w systemie Linux można przedkładać polecenia z klauzulami "VAR = VAL". Dla ogólnych przypadkach można przygotować otoki skrypt, który ustawia środowisko i uruchomić rzeczywiste polecenie:

na oknach:

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

Jeśli wartość zmiennej zależy od konfiguracji, można skonfigurować skrypt otoki z configure_file.

UPDATE:

Jak zauważono @sakra, env sposób narzędzie cmake wykonywalnego może być stosowany jako skrypt owijki:

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

ten sposób dostępne od CMake 3.2.

Powiązane problemy