Linux cmake execute_进程找不到源命令

Linux cmake execute_进程找不到源命令,linux,bash,cmake,global-variables,Linux,Bash,Cmake,Global Variables,我最近在cmake上遇到了一个非常有趣的问题。 问题如下: 我有一个CMakeLists.txt,它定义了一个相当简单的项目。我希望能够在构建项目时设置linux环境变量。为此,我想调用一个小脚本var_set.sh,来完成这个任务。看起来是这样的: #!/bin/bash MY_VAR=$1 export MY_VAR #!/bin/bash MY_VAR=$1 echo "$MY_VAR" 在CMakeLists.txt中,我按如下方式运行它: execute_process(COMMA

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

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

#!/bin/bash
MY_VAR=$1
export MY_VAR
#!/bin/bash
MY_VAR=$1
echo "$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})
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})
这个的输出是

-- No such file or directory
我认为问题在于
源代码
命令。如果我使用
/var\u set.sh
而不是
source var\u set.sh
脚本实际上会被执行,但是,当然,我无法获得想要导出的变量

有人知道这种行为的原因吗

UPD:

我逐渐明白,要达到我最初想要的目标可能根本不可能

最初的想法和动机如下。我们有一个使用ROS的比较大的项目。它用柳絮做成一切。它基本上是按照CMakeLists.txt和package.xml文件定义的顺序,为在子文件夹中找到的所有包调用一个cmake(这里的外观并不重要)。它还提供了使用find_包等的重写方式

问题是代码中有很大一部分是以我无法影响的方式编写的。此部分依赖于库G2O(图形优化),而G2O包不是“catkinized”,即catkin无法知道提供了哪些库

G2O本身定义了相当多的库,我们可以通过FindG2O.cmake文件找到它们(但是,如果一个库是,比如说,“core”,我们通过FindG2O.cmake中设置的名称“G2O_core_library”知道它)。我们还使用环境变量“G2O_ROOT”来指向当前的G2O安装

我的想法是在构建G2O时设置这个环境变量(使用一个包裹在它周围的柳絮元包),并将这些知识提供给以后构建的任何人,因为这样可以方便地使用FindG2O.cmake

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


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

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


因此,您最好使用
$ENV{blah}
来设置所需的变量。或者(更好)只使用CMake变量。。。有很多方法可以做到这一点。只需提供您想要实现的更多详细信息。

使用的
OUTPUT\u变量
选项

使脚本如下所示:

#!/bin/bash
MY_VAR=$1
export MY_VAR
#!/bin/bash
MY_VAR=$1
echo "$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})
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配置步骤的输出为:

-- 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并对文件进行后期处理。

为什么不通过cmake的$ENV{设置变量。您在哪里找到源关键字?它不在官方文档中,嘿,谢谢您的回答。嗯,我尝试使用$ENV{}事实上。问题是,在当前之后调用的下一个cmake没有看到它。请参阅UPD。嘿,谢谢你的回答!我已经更新了问题的更多细节。我知道这不是使用cmake的预期方式,在正常情况下,我甚至不会尝试使用这种肮脏的魔法。但是当你我们正在使用一个相对较旧的代码,并希望将其连接到一组使用新构建系统的新代码。如果你问我,我会坚持使用纯CMake,但这显然不是他们在ROS中使用的方式。