CMake将unix转换为windows路径

时间:2015-04-01 17:42:11

标签: windows cmake msys

我正在尝试转换unix样式的MSYS路径,例如 /c/my/path/to/a/folder 到Windows路径,或CMake会理解的东西, 例如C:/my/path/to/a/folder。 我希望它能够在一条已经正确的路径上工作。

有没有正确的方法呢?

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

修改:file(TO_CMAKE_PATH mypath result)无效

2 个答案:

答案 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输出中。我不完全确定这是否有必要;您应该在自己的特定用例中使用自己的判断力。