【发布时间】:2019-04-04 17:12:48
【问题描述】:
我正在尝试构建一个 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 包含真实路径...
有什么想法吗?
【问题讨论】:
-
我完全不熟悉 rust/cargo,但熟悉 CMake。我将您的问题理解为
CARGO_TARGET_DIR是一个 enviornment 变量,命令cargo期望在其环境中找到该变量。是这样吗? -
TBH 我不明白在环境中设置的变量和环境变量之间的区别。 doc.rust-lang.org/cargo/reference/environment-variables.html 解释了 Cargo 正在寻找的东西,我认为
set()是实现这一目标的 CMake 方式...... -
@tsyvarev,如果您碰巧已经知道答案,则此问题只是链接问题的副本。我们不应该假设未来的读者会这样。在这种情况下,@angew 提供了您提供的链接中没有的真实见解,即“CMake 的 set 命令不设置环境变量,它设置了 CMake 变量。”以及他关于为什么
set(ENV{VAR} value)不起作用的全部解释性评论。编辑:仅仅因为答案是重复的并不意味着问题是。 -
您的问题和链接的问题是关于从 CMake 为自定义命令/目标设置环境变量。这就是为什么您的一个被标记为链接的副本的原因。您解决问题的尝试是否与引用问题中的尝试不同是无关的——你们都想要相同的。请注意,在 Stack Overflow 上,“重复”确实 not 意味着“坏”并且 not 意味着立即删除。这两个问题可能共存并获得支持。我们只希望答案在一个地方,我们不想对每个问题都重复那个答案。
标签: cmake rust-cargo