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

Why can't Cargo read an environmental variable I'm setting in CMake?

我正在尝试构建一个 Rust hello world 作为更大 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 之前在 shell 中设置它,二进制文件会显示在我选择的任何目录中,如果我在 shell 中未设置它,它默认为 ${CMAKE_CURRENT_SOURCE_DIR}/src/rtde_interface/target/,但构建结果永远不会被放入 ${CMAKE_CURRENT_BINARY_DIR},我不知道为什么。我已经使用 Cmake message 函数来确认 CMAKE_CURRENT_BINARY_DIR 包含真实路径...

有什么想法吗?

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