CMake 将 unix 转换为 windows 路径

CMake convert unix to windows path

我正在尝试转换 unix 风格的 MSYS 路径,例如 /c/my/path/to/a/folder 到 Windows 路径,或者 CMake 可以理解的路径, 例如 C:/my/path/to/a/folder。 我希望它在已经正确的路径上工作。

有什么正确的方法吗?

注意:请不要提及cygwin的cygpath。

编辑:file(TO_CMAKE_PATH mypath result) 无效

没有用于此的内置 CMake 功能,但您可以编写 function/macro 来执行此操作:

macro(msys_to_cmake_path MsysPath ResultingPath)
  string(REGEX REPLACE "^/([a-zA-Z])/" "\1:/" ${ResultingPath} "${MsysPath}")
endmacro()

set(mypath "/c/my/path/to/a/folder")
msys_to_cmake_path(${mypath} result)

message("Converted \"${mypath}\" to \"${result}\".")

话虽如此,我同意 Antonio 的评论,因为首先需要这个似乎很不寻常。

作为已接受答案的替代方案,您可能希望考虑 MSYS 本身将在 MSYS 父进程和本机子进程之间的任何边界执行转换;因此,在 MSYS shell 控制台中:

cmd //c echo /c/my/path/to/a/folder

将显示适当转换的路径 c:/my/path/to/a/folder。此外,这种技术提供了可能的优势,它将发出 完全 转换的路径的本机形式,例如:

cmd //c echo /home/my/path/to/a/folder

生成其原生等效项 C:/MinGW/msys/1.0/home/my/path/to/a/folder,(假设您的 MSYS 安装在推荐的默认位置 C:/MinGW/msys/1.0)。

需要注意的是 运行ning MSYS shell 没有正确初始化,如 msys.bat 执行的那样,可能无法工作,(尤其是当 运行ning 在 64-位 Windows),你 可能 能够 运行 来自本机进程(例如在 CMake 中)的等效命令,如:

C:/MinGW/msys/1.0/bin/sh -c 'cmd //c echo /home/my/path/to/a/folder'

请注意,如果您从一个本身在 MSYS 控制台中 运行ning 的本机进程调用它,初始化将正确地为控制台自己的 shell 进程执行,并且应该从而通过本机进程传播;如果您尝试在本机 Windows 控制台(或其他本机容器)中直接从 cmd.exe 进程调用 MSYS 进程,则更有可能出现问题。

另请注意,如果相关路径名包含空格(这绝不是一个好主意),您可能需要将其括在双引号内:

cmd //c echo "/home/my/path with spaces"

在这种情况下,一些实验表明双引号保留在 cmd 输出中。我不确定这是否有必要;您应该根据自己的特定使用情况自行决定。