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 输出中。我不确定这是否有必要;您应该根据自己的特定使用情况自行决定。
我正在尝试转换 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 输出中。我不确定这是否有必要;您应该根据自己的特定使用情况自行决定。