我最近在使用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”,脚本实际上会被执行,但当然,我无法获得所需的导出变量。
有人知道这种行为的原因吗?
更新:
我意识到最初想要的可能根本不可能实现。
最初的想法和动机如下。我们有一个相对较大的项目使用ROS。它使用catkin_make来构建所有内容。它基本上是按照CMakeLists.txt和package.xml文件定义的顺序调用所有子文件夹中找到的包的cmake(这里不重要)。它还提供了一种覆盖方式来使用find_package等。
问题是代码的一个重要部分是以我无法影响的方式编写的。这一部分依赖于图优化库G2O(Graph Optimization),而G2O包未经过“catkin化”,即catkin无法知道提供哪些库。
G2O本身定义了相当数量的库,我们通过FindG2O.cmake文件可以找到它们(但如果库是“core”,那么我们会使用FindG2O.cmake中设置的“G2O_CORE_LIBRARY”名称进行了解)。我们还使用一个环境变量“G2O_ROOT”来指向当前的g2o安装。
我的想法是在构建G2O时设置此环境变量(使用包装在其周围的catkin元包),并使这些知识对于后续构建的任何人都可用,因为这将使FindG2O.cmake的使用变得容易。
我理解这种解释非常混乱。如果有不清楚的,请问一下。
似乎我试图实现的是不可能的,因为catkin_make可能会在不同的子进程中调用不同的cmake,然后,当然,我无法修改父进程。