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

vs91vp4v  于 2022-11-11  发布在  其他
关注(0)|答案(4)|浏览(623)

我有一个使用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相对于我的项目根目录的路径,这样这个脚本就可以从任何地方运行。

nbnkbykc

nbnkbykc1#

您可以用途:

file(RELATIVE_PATH variable directory file)

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

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

mfuanj7w2#

如果要获取相对于项目根目录的路径,可以使用PROJECT_SOURCE_DIR CMake变量:

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

请记住,MY_EXECUTABLE必须包含文件完整路径

eit6fx6z

eit6fx6z3#

获取当前源目录的相对路径

file(RELATIVE_PATH relative ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

测试项目:

message(STATUS "source base: \"${CMAKE_SOURCE_DIR}\"")
message(STATUS "current: \"${CMAKE_CURRENT_SOURCE_DIR}\"")
message(STATUS "relative: \"${relative}\"")

结果:

--source base: "C:/Project/Software/Test/source"
--current: "C:/Project/Software/Test/source/unittest/libs/fsm
--relative: "unittest/libs/fsm"
5anewei6

5anewei64#

类似这样的方法可以奏效:

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文档。
(As顺便说一句,这让我怀念起ksh的日子。)

相关问题