我有一个使用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路径,以便可以从任何地方运行此脚本.
您可以使用:
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日子。)
| 归档时间: |
|
| 查看次数: |
9099 次 |
| 最近记录: |