首页 > 解决方案 > CMake 用 add_custom_target 中的相对“../../”替换命令的部分绝对路径

问题描述

我正在尝试将自定义目标添加到我的 cmake 设置中。因为我想使用一组参数执行特定工具,所以需要它。可执行文件本身是预构建的,位于我要构建的仓库中(因此仓库中有明确的 .exe,它没有构建)。

我使用了以下 cmake 命令:

add_custom_target(some_target ALL DEPENDS ${INPUT_FILES} COMMAND <path_to_repository>/<path_within_repository>/my_tool.exe "arguments")

这是一个问题的症结所在:

<path_to_repository>/<path_within_repository>/my_tool.exe

可执行文件的路径构建为使用一些动态和静态部分的绝对路径(<path_to_repository> 显然是动态的,并在“add_custom_target”之前扣除。<path_within_repository> 是静态路径,在 cmake 中硬编码。)

例如,我们有:

C:/user/repos/source/MY_REPO/PROJECT/Sources/SpecialTool/bin/my_tool.exe
<path_to_repo ------------->/<path_within_repository ------->

问题是当我开始执行 cmake 并构建时。从日志中我可以看到,由于某种原因,<path_to_repository> 的部分总是被“../../”替换(尽管我message()用来打印完整的 <path_to_repository>/<path_within_repository> 并且它是正确的)。因此,在执行命令时,我在 make 日志中得到以下信息:

../../Sources/SpecialTool/bin/my_tool.exe

失败并显示一个相当简单的错误消息

'..' is not recognized as an internal or external command,

可运行的程序或批处理文件。

因为它试图在 Windows 上构建它,所以显然带有“/”而不是“\”的相对路径不起作用(Source/SpecialTool/bin/my_tool.exe可以工作,但显然你不能在 Windows 上使用斜杠和相对路径)。

所以有2个问题:

  1. 为什么绝对路径的一部分被相对路径替换(所以 <path_to_repo> make 使用 "../../" 代替)?
  2. 如何强制使用“\”而不是“/”(以便相对..\..\Sources\...\my_tool.exe路径有效)?

我已经尝试在路径中添加反斜杠( so C:\\user\\repos\\source\\MY_REPO\\PROJECT\\Sources\\SpecialTool\\bin\\my_tool.exe),使用引号等,但似乎没有任何效果。我也尝试使用add_custom_command然后在 in 中使用它add_custom_target,但这给了我与直接调用 command in 完全相同的行为add_custom_target

唯一没有发生此问题的情况是当我手动将“my_tool.exe”放在存储库本身上方的某个文件夹层次结构中(因此C:/user/repos/source/my_tool.exeC:/my_tool.exe自然路径不包含构建存储库本身的完整路径)。在为这个项目编写 cmake 时,我也无法实际使用它。

标签: cmakecmake-custom-commandadd-custom-target

解决方案


推荐阅读