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