如何使用CMake获取目标的相对路径?

Ale*_*lex 3 bash cmake

我有一个使用CMake生成构建脚本的项目,每个平台都会将生成的可执行文件放在不同的位置.我们团队中有一个非程序员,他没有构建工具,我希望能够捆绑运行项目所需的所有文件,脚本和可执行文件,以便他可以运行项目.

为此,我添加了一个自定义目标,它可以获取所有必需的文件并将其压缩.它还会生成一个非常简单的脚本(包含在zip文件中),他只需单击该脚本即可运行脚本然后启动可执行文件,如下所示:

add_custom_target(runcommand
  COMMAND echo '\#!/bin/bash -eu' > run.command &&
          echo 'cd `dirname $$0`' >> run.command &&
          echo './scripts/prerun_script.sh && ${MY_EXECUTABLE}' >> run.command &&
          chmod +x run.command)
Run Code Online (Sandbox Code Playgroud)

这个问题是MY_EXECUTABLE是我系统上可执行文件的硬编码路径.我希望它是一个相对路径,这样我就可以获取这个结果zip文件,将其解压缩到任何地方并从那里运行它.我想要的是获取相对于我的项目的根目录的MY_EXECUTABLE路径,以便可以从任何地方运行此脚本.

Lin*_*cer 8

您可以使用:

file(RELATIVE_PATH variable directory file)
Run Code Online (Sandbox Code Playgroud)

具体来说,假设MY_ROOT包含根目录(可能有一个合适的预定义CMake变量),这将设置rel为相对路径MY_EXECUTABLE:

file(RELATIVE_PATH rel ${MY_ROOT} ${MY_EXECUTABLE})
Run Code Online (Sandbox Code Playgroud)


zer*_*iff -2

像这样的事情会起作用:

THISDIR=`pwd`
MY_EXECUTABLE=$THISDIR/test/someexec
REL_EXECUTABLE=${MY_EXECUTABLE##$THISDIR/}
echo $REL_EXECUTABLE 
Run Code Online (Sandbox Code Playgroud)

基本上,这会切断 的基本路径$MY_EXECUTABLE。在此示例中,我只是将其设置MY_EXECUTABLE为测试以提供完整路径。您想要的一行等效内容是:

${MY_EXECUTABLE##`pwd`/}
Run Code Online (Sandbox Code Playgroud)

我想这假设pwd是你的项目的根源。否则,请参阅Cmake 变量文档。

(顺便说一句,这让我怀念那些ksh日子。)