为什么货物不能读取我在CMake中设置的环境变量? [重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

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

有任何想法吗?

cmake rust-cargo
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.