cmake - 避免包含的 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
中,以便它们完全独立。我仍然会从根文件中获得所有设置的好处,但是开发人员可以在他们处理的任何包中更新测试脚本行。但这意味着如果我们移动/重命名测试脚本,那么有很多地方需要修复(这可以通过大量查找和替换来实现)。
解决方案
推荐阅读
- jsf - p:datatable rowkey 没有用 var 解析
- sql-server - MSSQL 按嵌套值分组
- spring - Spring boot中没有找到网址:http://localhost:8080的网页
- c# - wpf在数据网格内的组合框上使用向下箭头
- php - 如何在具有两个不同结果的函数中触发两个查询
- forms - 可编辑的文本字段在表单中不起作用
- ios - CallKit 与 OpenTok 一起使用
- cordova - 将离子与纱线一起使用会导致科尔多瓦出现问题
- react-native - 如何在本机反应中将数据保存在 SD 卡上?
- c# - 从父实体中删除子实体 - EF Core 2.2