CMake:将相对路径转换为绝对路径,将build目录作为当前目录

时间:2016-08-18 20:51:00

标签: cmake

在CMake中,您可以使用

将相对路径转换为绝对路径
get_filename_component(ABSOLUTE_PATH ${RELATIVE_PATH} ABSOLUTE)

但是,../../other_program/等路径基于源目录(即CMakeLists.txt文件所在的目录),而不是构建目录(即调用cmake的目录)。如果将相对路径作为命令行选项,这可能会导致一些混淆。

有没有办法告诉get_filename_component它应该基于当前二进制目录而不是当前源目录的相对路径?

3 个答案:

答案 0 :(得分:18)

来自get_filename_component 的文档(突出显示为我)

get_filename_component(<VAR> <FileName>
                       <COMP> [BASE_DIR <BASE_DIR>]
                       [CACHE])
     

<VAR>设置为<FileName>的绝对路径,其中<COMP>是其中之一:

     

ABSOLUTE =文件的完整路径   REALPATH =解决了符号链接的现有文件的完整路径

     

如果提供的<FileName>是相对路径,则相对于给定的基目录<BASE_DIR>进行评估。如果没有提供基目录,则默认基目录将是CMAKE_CURRENT_SOURCE_DIR

     

使用正斜杠返回路径,并且没有尾部斜杠。如果指定了可选的CACHE参数,则结果变量将添加到缓存中。

因此,您使用:

get_filename_component(buildDirRelFilePath "${myFile}"
                       REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")

要将文件的绝对路径转换为相对路径,可以使用file command

file(RELATIVE_PATH <variable> <directory> <file>)
     

计算从<directory><file>的相对路径,并将其存储在<variable>

file(RELATIVE_PATH buildDirRelFilePath "${CMAKE_BINARY_DIR}" "${myFile}")

答案 1 :(得分:9)

get_filename_component(MY_RESULT_ABSOLUTE_PATH_VAR
                       "${CMAKE_CURRENT_LIST_DIR}/${MY_RELATIVE_PATH_VAR}"
                       ABSOLUTE)

答案 2 :(得分:3)

您可以检查路径是否是if(IS_ABSOLUTE path)的绝对路径,以及它是否不包含您想要的基本目录。例如,

if(NOT IS_ABSOLUTE ${p})
    set(p "${CMAKE_CURRENT_BINARY_DIR}/${p}")
endif()