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

时间:2014-08-21 18:02:41

标签: 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)

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

2 个答案:

答案 0 :(得分:7)

您可以使用:

file(RELATIVE_PATH variable directory file)

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

file(RELATIVE_PATH rel ${MY_ROOT} ${MY_EXECUTABLE})

答案 1 :(得分:-1)

这样的事情会起作用:

THISDIR=`pwd`
MY_EXECUTABLE=$THISDIR/test/someexec
REL_EXECUTABLE=${MY_EXECUTABLE##$THISDIR/}
echo $REL_EXECUTABLE 

基本上,这会从$MY_EXECUTABLE中删除基本路径。在此示例中,我只是将MY_EXECUTABLE设置为测试,以便为其提供完整路径。你想要的一行等价物是:

${MY_EXECUTABLE##`pwd`/}

我想这假设pwd是项目的根。否则,请参阅Cmake variable doc。

(顺便说一句,这让我怀念ksh天。)