最近我在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文件找到它们(但是如果库是“核心”,我们知道它的名称是"G2O_CORE_LIBRARY“,设置在FindG2O.cmake中)。我们还使用环境变量"G2O_ROOT“指向当前的g2o安装。
我的想法是在构建G2O时设置这个环境变量(使用包装在它周围的catkin元包),并使以后构建的人可以使用这些知识,因为这样可以轻松地使用FindG2O.cmake。
我知道这个解释很混乱。如果有什么不清楚,请问一问。
我试图实现的目标似乎是不可能的,因为catkin_make可能在不同的子进程中调用不同的cmake,然后,当然,我无法修改父进程。
发布于 2015-09-08 20:52:01
使用OUTPUT_VARIABLE
选项execute_process
。
使您的脚本看起来如下:
#!/bin/bash
MY_VAR=$1
echo "$MY_VAR"
并在CMakeLists.txt
中使用它,如下所示:
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并对文件进行后处理。
发布于 2015-03-16 14:40:00
你只是做错了。即使source
能够工作(但它不能工作,因为它是bash
内部命令,而不是文件系统中的一个真正的二进制/可执行文件),它不会影响任何东西!因为cmake
启动子进程(通过execute_process()
)并且它将被终止,所以w/执行结果可用在相应的变量中。设置子进程中的任何环境变量都不会影响父环境。
因此,最好使用$ENV{blah}
来设置所需的变量。或者(更好)只使用CMake变量..。有很多方法可以做到这一点。只要给出更多的细节,你想要实现什么。
https://stackoverflow.com/questions/29053977
复制相似问题