将环境变量传递给CMake execute_process中的COMMAND

5
我有以下的CMake代码片段,在WORKING_DIRECTORY中运行COMMAND。我尝试了不同的方法来传递环境变量(MBEDTLS_INCLUDE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/../mbedtls/mbedtls/include),但是都没有成功。 可用的片段(不带环境变量):
set(BUILD_CMD cargo build --features parsec-client/no-fs-permission-check)
set(WORKING_DIR "${CMAKE_CURRENT_SOURCE_DIR}/parsec_se_driver")

execute_process( COMMAND ${BUILD_CMD}
                 RESULT_VARIABLE CMD_ERROR
                 WORKING_DIRECTORY ${WORKING_DIR} )

if(NOT ${CMD_ERROR} MATCHES "0")
MESSAGE(SEND_ERROR "BUILD_CMD STATUS:" ${CMD_ERROR})
endif()

我该如何将环境变量传递给execute_process?

如果我写类似以下的内容:

execute_process( COMMAND MBEDTLS_INCLUDE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/../mbedtls/mbedtls/include cargo build --features parsec-client/no-fs-permission-check
                 RESULT_VARIABLE CMD_ERROR
                 WORKING_DIRECTORY ${WORKING_DIR} )

或者将不同部分赋值给变量,或添加引号,我得到了:
BUILD_CMD STATUS:No such file or directory

所以我找到了一些解决方案,使用set(ENV{VARNAME} ...}这样的方式,例如set(ENV{MBEDTLS_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../mbedtls/mbedtls/include),目前的问题是有更方便的方法将环境变量传递给COMMAND。这个结构是有效的,变量被传递了。如果有其他解决方案,我会非常感激,而不是这个临时解决方法。 - user3518295
2个回答

7

根据CMake邮件列表中的建议,你使用set(ENV ...)的解决方案是完全有效的:

set(ENV{MBEDTLS_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../mbedtls/mbedtls/include)
execute_process( 
    COMMAND ${BUILD_CMD}
    RESULT_VARIABLE CMD_ERROR
    WORKING_DIRECTORY ${WORKING_DIR}
)

您还可以使用CMake的命令行实用工具,通过cmake -E env修改后的环境中运行命令。
execute_process( 
    COMMAND ${CMAKE_COMMAND} -E env 
        MBEDTLS_INCLUDE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/../mbedtls/mbedtls/include" ${BUILD_CMD}
    RESULT_VARIABLE CMD_ERROR 
    WORKING_DIRECTORY ${WORKING_DIR}
)

0
这个也应该可以工作:
execute_process(
   COMMAND /bin/bash -c "CC=/usr/bin/gcc make"
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接