2016-01-27 71 views
15

也許我錯過了一些明顯的東西,但我似乎無法弄清楚如何明確設置可通過add_custom_target()啓動的進程看到的環境變量。如何修改傳遞給自定義CMake目標的環境變量?

我試過如下:

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

遺憾的是,%PATH%環境出現變量不變somecommand。 (我已經設置了一個能夠再現問題的Gist here。)

我在做什麼錯?

+0

我建議,既然你正在創建一個新的進程(從你的評論),那麼新進程將提供自己的環境,而不是繼承主進程的環境。如果你創建了一個主進程的子進程,那麼環境應該被繼承 - 但我對cmake一無所知,所以我可能會在這裏離開。不過你應該使用'反斜槓'作爲目錄分隔符,而不是'/',因爲'/'是一個開關前綴。有時'/'工作愉快,但它不可靠。 – Magoo

回答

13

設置環境變量自定義目標的可移植的方法是使用的CMake的命令行工具模式命令env

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

例如爲:

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

另見Command Line Tool Mode

12

您在配置步驟設置的環境變量,但對於在add_custom_target構建步驟執行命令中指定。另見CMake的常見問題解答:How can I get or set environment variables?

[...]
環境變量SET中的CMakeLists.txt 只有 採取的cmake本身(配置時)效果, 所以你不能用這個方法來設置自定義命令可能需要的環境變量 (構建時間)。 通過各種CMake命令 (例如add_custom_command(),當前還不支持), 禁止環境變量支持可接受的解決方法可能是調用shell腳本,而不是包裝要執行的命令的 。

目前add_custom_target(和其他人的命令,其中定義構建步驟的動作,例如add_custom_command)不支持簡單的設置環境變量。正如在this bugreport中建議的那樣,對於Linux上的設置變量的值沒有空格,您可以在命令前添加「VAR = VAL」子句。對於一般情況下,你可以準備包裝腳本,設置環境和運行實際的命令:

在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 ñ的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... 
) 

如果變量的值取決於配置,您可以配置包裝腳本與configure_file

UPDATE

正如@sakra指出,cmake可執行的env工具模式可被用作包裝腳本:

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

這種方式是可用的,因爲CMake的3.2。

相關問題