首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cmake execute_process找不到源命令

cmake execute_process找不到源命令
EN

Stack Overflow用户
提问于 2015-03-14 20:43:58
回答 2查看 3.7K关注 0票数 3

最近我在cmake上遇到了一个很有趣的问题。问题如下:

我有一个CMakeLists.txt,它定义了一个相当简单的项目。我希望能够在构建项目时设置linux环境变量。为此,我想调用一个很小的脚本var_set.sh来实现它。看起来是这样的:

代码语言:javascript
运行
复制
#!/bin/bash
MY_VAR=$1
export MY_VAR

CMakeLists.txt中,我按如下方式运行它:

代码语言:javascript
运行
复制
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})

它的输出是

代码语言:javascript
运行
复制
-- 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文件找到它们(但是如果库是“核心”,我们知道它的名称是"G2O_CORE_LIBRARY“,设置在FindG2O.cmake中)。我们还使用环境变量"G2O_ROOT“指向当前的g2o安装。

我的想法是在构建G2O时设置这个环境变量(使用包装在它周围的catkin元包),并使以后构建的人可以使用这些知识,因为这样可以轻松地使用FindG2O.cmake。

我知道这个解释很混乱。如果有什么不清楚,请问一问。

我试图实现的目标似乎是不可能的,因为catkin_make可能在不同的子进程中调用不同的cmake,然后,当然,我无法修改父进程。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-08 20:52:01

使用OUTPUT_VARIABLE选项execute_process

使您的脚本看起来如下:

代码语言:javascript
运行
复制
#!/bin/bash
MY_VAR=$1
echo "$MY_VAR"

并在CMakeLists.txt中使用它,如下所示:

代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 2.6)
execute_process(COMMAND sh "var_set.sh" "VALUE" "VALUE2"
            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
            RESULT_VARIABLE variable_RESULT
            OUTPUT_VARIABLE variable_OUTPUT
)

message(STATUS ${variable_RESULT})
message(STATUS ${variable_OUTPUT})

然后,CMake配置步骤的输出如下:

代码语言:javascript
运行
复制
-- The C compiler identification is GNU 5.1.1
-- The CXX compiler identification is GNU 5.1.1
-- Check for working C compiler: /usr/lib64/ccache/cc
-- Check for working C compiler: /usr/lib64/ccache/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/lib64/ccache/c++
-- Check for working CXX compiler: /usr/lib64/ccache/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- 0
-- VALUE

-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/out

这种方法的一个缺点是,您必须抑制脚本中所有不必要的输出。或者,使用OUTPUT_FILE并对文件进行后处理。

票数 1
EN

Stack Overflow用户

发布于 2015-03-16 14:40:00

你只是做错了。即使source能够工作(但它不能工作,因为它是bash内部命令,而不是文件系统中的一个真正的二进制/可执行文件),它不会影响任何东西!因为cmake启动子进程(通过execute_process())并且它将被终止,所以w/执行结果可用在相应的变量中。设置子进程中的任何环境变量都不会影响父环境

因此,最好使用$ENV{blah}来设置所需的变量。或者(更好)只使用CMake变量..。有很多方法可以做到这一点。只要给出更多的细节,你想要实现什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29053977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档