首页 > 解决方案 > 避免包含的 cmake 文件中的绝对路径

问题描述

在工作中,我们在 ROS 中构建了一个堆栈,CMakeLists.txt每个包中都有文件。我正在尝试切换到该catkin build工具,这要求每个包都能够独立于其他包构建​​。文件结构如下所示:

base:
CMakeLists.txt
-- package1:
   [files]
   CMakeLists.txt
-- package2:
   [files]
   CMakeLists.txt

之前的构建工具 ( catkin_make) 从根源目录开始,然后将所有发现CMakeLists.txt的文件添加为子目录。这意味着在基础(或进一步向下)中设置的变量仍然存在。

我遇到的一个大问题是我们有一些测试配置脚本可以为每个包加载和运行。您可以从路径中的基本文件中找到它们${CMAKE_SOURCE_DIR}/path/to/file。对于所有子目录,此路径仍然有效,因为CMAKE_SOURCE_DIR它指向根。根目录中有很多设置,CMakeLists.txt例如编译器设置和标志,以及 IDE 的配置信息,尤其是这些测试文件的路径。

在使所有内容独立时,我INCLUDE(../CMakeLists.txt)在每个子目录中添加以访问该文件。但是,当我这样做时,我还需要将根CMakeLists.txt中的行更改为硬编码路径,如下所示:

${CMAKE_SOURCE_DIR}/path/to/file --> ~/hard/coded/path/to/file

这是因为CMAKE_SOURCE_DIR更改成为每个包的目录,所以我不能从那里开始。

由于硬编码有明显的主要缺点(这甚至不适用于硬件,因为文件结构有很大不同),我该如何解决这个问题?一个定义类似CMAKE_DIR_OF_THE_FILE_WHERE_THIS_LINE_IS但我怀疑存在的变量。我还可以检查并将测试脚本包含行移动到每个包CMakeLists.txt中,以便它们完全独立。我仍然会从根文件中获得所有设置的好处,但是开发人员可以在他们处理的任何包中更新测试脚本行。但这意味着如果我们移动/重命名测试脚本,那么有很多地方需要修复(这可以通过大量查找和替换来实现)。

标签: cmake

解决方案


推荐阅读