为什么Cargo无法读取我在CMake中设置的环境变量?

时间:2019-04-04 17:12:48

标签: cmake rust-cargo

我正试图建立一个Rust hello世界,作为更大的catkin / cmake构建的一部分。相关CMakeLists.txt文件的相关部分是:

add_custom_target(_rtde_interface ALL)
set(CARGO_TARGET_DIR ${CMAKE_CURRENT_BINARY_DIR})
add_custom_command( TARGET _rtde_interface
                    PRE_BUILD
                    COMMAND cargo build
                    # WORKING_DIRECTORY ${CARGO_TARGET_DIR}/src/rtde_interface
                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/rtde_interface
                    VERBATIM)

但是Cargo表现得好像没有设置CARGO_TARGET_DIR变量。如果在调用Catkin之前在外壳中设置了二进制文件,则二进制文件会显示在我选择的任何目录中,并且如果我在外壳中将其保留为未设置状态,则默认为${CMAKE_CURRENT_SOURCE_DIR}/src/rtde_interface/target/,但是构建结果永远不会放入{{1} },我也不知道为什么。我已经使用Cmake ${CMAKE_CURRENT_BINARY_DIR}函数来确认CMAKE_CURRENT_BINARY_DIR包含真实路径...

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

CMake的set命令未设置环境变量,而是设置CMake变量。如果需要修改在构建时启动的命令的环境,则可以使用CMake的命令执行模式。看起来像这样:

add_custom_target(_rtde_interface ALL)
add_custom_command( TARGET _rtde_interface
                    PRE_BUILD
                    COMMAND ${CMAKE_COMMAND} -E env CARGO_TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} cargo build
                    # WORKING_DIRECTORY ${CARGO_TARGET_DIR}/src/rtde_interface
                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/rtde_interface
                    VERBATIM)

如果注释掉的位实际上是您想要的功能,并且无法正常工作,则可以用以下方式替换它:

WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src/rtde_interface