如何使用CMake获取系统路径分隔符

5

我正在使用CMake配置一些项目。我需要将路径分隔符(例如/\)存储到一个CMake变量中,以便进行一些操作,无论具体是什么。我该如何做?


1
CMake命令file(TO_CMAKE_PATH "${dir}" dir)file(TO_NATIVE_PATH "${dir}" dir)有帮助吗? - vre
@vre:如果您能再详细解释一下,可能会更好理解…… - einpoklum
从文档中得知:TO_CMAKE_PATH 模式将本地 <path> 转换为带有正斜杠 (/) 的 cmake 样式路径。输入可以是单个路径或系统搜索路径,如 $ENV{PATH}。搜索路径将被转换为由 ; 字符分隔的 cmake 样式列表。TO_NATIVE_PATH 模式将 cmake 样式 <path> 转换为具有特定于平台的斜线 (\ 在 Windows 上和其他地方 /) 的本机路径。始终在要将其视为此命令的单个参数处理的 <path> 周围使用双引号。 - vre
@vre:但是为什么空路径(${dir}最初是"")在转换后会产生有趣的结果呢? - einpoklum
我刚在Windows上测试了以下CMakeLists.txt:cmake_minimum_required (VERSION 2.8.12) project(a_test) file(TO_CMAKE_PATH "\\" path) message(STATUS "\\ 转换为CMake路径 ${path}") file(TO_NATIVE_PATH "/" path) message(STATUS "/ 转换为本地路径 ${path}") file(TO_CMAKE_PATH "" path) message(STATUS "空路径转换为CMake路径 ${path}") file(TO_NATIVE_PATH "" path) message(STATUS "空路径转换为本地路径 ${path}")一切都按预期工作。 - vre
1个回答

4

目前还没有可直接使用的CMake变量,用于系统路径分隔符。

但是,如@vre所评论,可以使用file(TO_NATIVE_PATH)命令来实现:

file(TO_NATIVE_PATH "/" _separator)
message("The systems's path separator is '${_separator}'")

如果您已经有完整的路径,那么使用 $<SHELL_PATH:...> generator expression 很有用(CMake版本 >= 3.4):

... 的内容将被转换为 shell 路径格式。例如,在 Windows shells 中,斜杠将被转换为反斜杠,并且在 MSYS shells 中,驱动器号将被转换为 posix 路径。 ... 必须是绝对路径。


你确定 /TO_NATIVE_PATH 在所有平台上都会产生路径分隔符吗?特别是在 Windows 上,甚至没有一个文件系统的根目录。 - einpoklum
2
@einpoklum 我不确定,所以我在Windows和Ubuntu上尝试了一下。两者都可以正常工作。如果我查看相关的CMake源代码,例如SystemTools::ConvertToWindowsOutputPath(),它主要是转换斜杠(与$<SHELL_PATH:...>生成器表达式不同)。 - Florian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接