【发布时间】:2015-03-14 20:43:58
【问题描述】:
我最近在 cmake 中遇到了一个非常有趣的问题。 问题如下:
我有一个 CMakeLists.txt,它定义了一个相当简单的项目。我希望能够在构建项目时设置一个 linux 环境变量。为此,我想调用一个小脚本var_set.sh 来完成它。它看起来像这样:
#!/bin/bash
MY_VAR=$1
export MY_VAR
在CMakeLists.txt我运行如下:
execute_process(COMMAND source var_set.sh VALUE
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE variable_RESULT)
message(STATUS ${variable_RESULT})
message(STATUS $ENV{MY_VAR})
这个的输出是
-- No such file or directory
我认为问题出在source 命令上。如果我使用./var_set.sh 而不是source var_set.sh,脚本实际上会被执行,但是,当然,我无法获得我想要导出的变量。
有人知道这种行为的原因是什么吗?
UPD:
我了解到,可能根本不可能实现我最初想要的。
最初的想法和动机如下。我们有一个使用 ROS 的比较大的项目。它使用 catkin_make 构建一切。它的基本作用是按照 CMakeLists.txt 和 package.xml 文件定义的顺序为它在子文件夹中找到的所有包调用一个 cmake(在这里看起来如何并不重要)。它还提供了一种覆盖方式来使用 find_package 等。
问题在于,有很大一部分代码是以我无法影响的方式编写的。这部分依赖于一个库 G2O(图优化)并且 G2O 包没有“catkinized”,即 catkin 无法知道提供了哪些库。
G2O 本身定义了相当多的库,我们可以通过 FindG2O.cmake 文件找到它们(但如果一个库是“核心”,我们通过 FindG2O.cmake 中设置的名称“G2O_CORE_LIBRARY”知道它)。我们还使用环境变量“G2O_ROOT”来指向当前的 g2o 安装。
我的想法是在构建 G2O 时设置此环境变量(使用包裹在其周围的 catkin 元包),并将这些知识提供给之后构建的任何人,因为这样可以轻松使用 FindG2O.cmake。
我知道这个解释很混乱。有不清楚的地方请追问。
似乎我想要实现的目标是不可能的,因为 catkin_make 可能会在不同的子进程中调用不同的 cmake,然后,当然,我无法修改父进程。
【问题讨论】:
-
为什么不通过 cmake 的 $ENV{ 设置变量。您在哪里找到源关键字?它不在cmake.org/cmake/help/v3.0/command/execute_process.html的官方文档中
-
您好,谢谢您的回答。嗯,我确实尝试使用 $ENV{}。问题是在当前调用之后的下一个 cmake 看不到它。请参阅 UPD。
标签: linux bash cmake global-variables