cmake - 在 CMake 中加入路径

标签 cmake

我正在尝试将两条路径连接在一起:

SET(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}/inkscape")

但是当 CMAKE_INSTALL_LIBDIR 包含绝对路径时,字符串连接并没有真正做到这一点。

是否有一个 CMake 函数接受多个路径参数并将最右边的绝对路径右侧的相对路径连接到绝对路径,如 Python 的 os.path.join是吗?

来自 Python 解释器的示例显示了所需的行为:

>>> from os.path import join
>>> join("/foo/bar", "/baz/qux")
'/baz/qux'
>>> join("foo/bar", "/baz/qux")
'/baz/qux'
>>> join("/foo/bar", "./baz/qux")
'/foo/bar/./baz/qux'
>>> join("/foo/bar", "../baz/qux")
'/foo/bar/../baz/qux'
>>> join("./foo/bar", "baz/qux")
'./foo/bar/baz/qux'

我需要处理前缀是绝对前缀(例如 CMAKE_INSTALL_PREFIX)和相对前缀(例如 $ORIGIN/.. pkg-config 文件通常需要 ${prefix})。正交地,我需要处理使用相对 CMAKE_INSTALL_LIBDIR 的 Linux 发行版和使用绝对发行版的 Linux 发行版。

最佳答案

编辑:根据 OP 反馈更新

CMake 中没有任何东西可以直接支持您想要的东西。但是,您可以轻松创建自己的 if针对您描述的四种情况的语句(使用 IS_ABSOLUTE):

if(IS_ABSOLUTE ${PREFIX_DIR})
    if(IS_ABSOLUTE ${CMAKE_INSTALL_LIBDIR})
        # Both absolute.
        set(CMAKE_INSTALL_PKGLIBDIR ....)
    else()
        # Prefix is absolute, but LIBDIR is relative.
        set(CMAKE_INSTALL_PKGLIBDIR ....)
    endif()
else()
    if(IS_ABSOLUTE ${CMAKE_INSTALL_LIBDIR})
        # Prefix is relative, but LIBDIR is absolute.
        set(CMAKE_INSTALL_PKGLIBDIR ....)
    else()
        # Both are relative.
        set(CMAKE_INSTALL_PKGLIBDIR ....)
    endif()
endif()

这可以概括并制成 function ,称为 directory_join() 或其他东西,并且可以在您需要的任何地方在整个 CMake 文件中使用。


假设我正确地解释了您的问题,您可以使用 CMake 完成一个join 机制。如果你有一些绝对路径和一些你想加入的相对路径,get_filename_component()命令可以提供帮助。这是一个一般的例子:

set(ABS_PATH "C:/the/absolute/path")
set(REL_PATH "../../some/other/relative/path")

# Concatenate your absolute and relative path(s) here.
get_filename_component(COMBINED_PATH ${ABS_PATH}/${REL_PATH} ABSOLUTE)

# Print our merged path to verify.
message(STATUS "COMBINED_PATH: ${COMBINED_PATH}")

我们可以从打印输出中看到,新变量 COMBINED_PATH 加入了两条路径,解析了任何相对性。

COMBINED_PATH: C:/the/some/other/relative/path

关于cmake - 在 CMake 中加入路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57382992/

相关文章:

curl - 找不到CURL(缺少: CURL_LIBRARY CURL_INCLUDE_DIR) on CMake

c++ - 在哪里放置 CMake 宏定义?

makefile - 如何修改安装路径而不再次运行配置脚本/cmake

c++ - 在 CMakeLists.txt 中执行 cmake 与在终端中执行 cmake 有什么区别,我们如何使其行为相同?

c++ - CMake 根据配置从构建中排除文件

c++ - 适用于 Windows 上 Clang 的 CMake 生成器

ubuntu - 交叉编译ROS Melodic on RaspberryPi 3B+问题

c++ - CMAKE Thrift 生成的文件编译器选项

我可以强制 cmake 在特定目标中包含我的头文件吗?

c++ - Qt Cmake 配置没有 C++ 编译器集的路径