【问题标题】:CMake: Convert relative path to absolute path or the cmake command line argumentsCMake:将相对路径转换为绝对路径或 cmake 命令行参数
【发布时间】:2020-05-14 00:19:14
【问题描述】:

我正在从源外部运行我的 cmake (3.16)。通常带有这些论点

cmake -S ./avionics_apps/ -B build -DINPUT_DIR:PATH=./other-build/

INPUT_DIR 变量中设置的相对路径转换为同样适用于源构建和源构建的绝对路径的方法是什么? get_filename_component 可以使用,但它需要一些基本路径。但是,我还没有在 cmake 中找到一个变量来指定 cmake run 所在的目录。有二进制和源目录。但是CMAKE_BINARY_DIRCMAKE_SOURCE_DIR 的源代码构建是相同的。

【问题讨论】:

  • 也许一个问题的例子会很有用。 INPUT_DIR 应自动转换为绝对路径。你是说这不会发生吗?如果你想存储当前工作目录为什么不使用-DCWD=`pwd`
  • INPUT_DIR 应该自动转换为绝对路径吗?它没有发生。在代码内部,它看起来与通过的相同。使用 -DCWD='pwd' 可能会起作用,但我希望 CMake 已经有了一些东西。
  • @Tsyvarev 来自 cmake(1) 的 CMake 文档,对于 -DIf a command in the project sets the type to PATH or FILEPATH then the <value> will be converted to an absolute path. 来自 set 命令 ` 此外,如果 是 PATH 或 FILEPATH 并且提供了 命令行上是相对路径,那么 set 命令会将路径视为相对于当前工作目录的路径,并将其转换为绝对路径。` 也许我误解了转换发生的时间或方式。
  • @fdk1342:你是对的!最困难的部分是理解不应在命令行中指定变量的类型...

标签: cmake


【解决方案1】:

感谢@fdk1342 的提示。如何实现自动转换:

  1. 当通过命令行传递变量时,不要不指定它的type

    -DINPUT_DIR=./other-build/
    
  2. CMakeLists.txt 中声明变量时,指定类型为 PATH 或 FILEPATH

    set(INPUT_DIR "" CACHE PATH "Input directory")
    

    隐式创建 CACHE 变量也可以:

    find_path(INPUT_DIR foo.h)
    

两个条件都满足时,变量的值会自动转换成绝对路径

其实这个在set command的描述里有描述:

如果缓存条目是由用户通过-D<var>=<value> 选项在cmake(1) 命令行上创建的,但未指定类型,则缓存条目可能在调用之前存在但未设置类型。在这种情况下,set 命令将添加类型。此外,如果<type> 是PATH 或FILEPATH,并且命令行中提供的<value> 是相对路径,那么set 命令会将路径视为相对于当前工作目录的路径,并将其转换为绝对路径.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-25
    • 2017-08-01
    • 2011-11-07
    • 2011-05-02
    相关资源
    最近更新 更多