【问题标题】:Why can't Cargo read an environmental variable I'm setting in CMake? [duplicate]为什么 Cargo 无法读取我在 CMake 中设置的环境变量? [复制]
【发布时间】: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


【解决方案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

【讨论】:

  • 嗯,cmake docs 听起来好像可以设置环境变量。 (我什至发现我犯了一个错误,但它并没有解决问题)。
  • @teryret 您确实可以使用特殊的set(ENV{VAR} value) 语法设置环境变量,但这适用于正在运行的 CMake 进程及其子进程(如果有)。构建在 CMake 完成运行后很长时间才会发生,因此您不能以这种方式影响构建环境。使用 CMake 时,牢记不同阶段(CMake 配置、CMake 生成、构建)始终很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2020-01-27
相关资源
最近更新 更多