我正在尝试转换unix样式的MSYS路径,例如
/c/my/path/to/a/folder
到Windows路径,或CMake会理解的东西,
例如C:/my/path/to/a/folder
。
我希望它能够在一条已经正确的路径上工作。
有没有正确的方法呢?
注意:请不要提及cygwin的cygpath。
修改:file(TO_CMAKE_PATH mypath result)
无效
答案 0 :(得分:3)
没有内置的CMake功能,但你可以编写一个函数/宏来实现它:
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}\".")
话虽如此,我同意安东尼奥的评论,因为首先需要这样做似乎不寻常。
答案 1 :(得分:2)
作为已接受答案的替代方案,您可能希望考虑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
)。
有一点需要注意,运行MSYS shell而没有正确初始化(由msys.bat执行)可能不起作用(特别是在64位Windows上运行时),可能能够运行来自本机进程内的等效命令(例如在CMake中),如:
C:/MinGW/msys/1.0/bin/sh -c 'cmd //c echo /home/my/path/to/a/folder'
请注意,如果从本身在MSYS控制台中运行的本机进程调用此方法,则会为控制台自己的shell进程正确执行初始化,因此应该通过本机进程传播;如果您尝试直接从cmd.exe进程,本机Windows控制台(或其他本机容器)中调用MSYS进程,则更有可能出现问题。
另请注意,如果相关路径名称包含空格(从来不是一个好主意),可能需要将其括在双引号中:
cmd //c echo "/home/my/path with spaces"
在这种情况下,一些实验表明双引号保留在cmd输出中。我不完全确定这是否有必要;您应该在自己的特定用例中使用自己的判断力。