我有一个使用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路径,以便可以从任何地方运行此脚本。
答案 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
天。)