我正在尝试将两条路径连接在一起:
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/