CMake将Unix路径转换为Windows路径

5
我正在尝试将类Unix风格的MSYS路径转换为Windows路径或CMake可以理解的路径,例如C:/my/path/to/a/folder。我希望它可以在一个已经正确的路径上工作。
有没有合适的方法来完成这个任务?
请注意:请不要提及cygwin的cygpath。
编辑:file(TO_CMAKE_PATH mypath result)并不能实现此功能。

不起作用,意味着给定 mypath,输出 result 是什么?请使用 message 命令进行调试,例如 message(STATUS "result = ${result}")。为什么你的初始路径是 MSYS 格式?为什么需要绝对路径?对于项目内的任何内容,您都可以使用相对路径,cmake 会负责将其转换为完整路径。您能否还打印出变量 CMAKE_SOURCE_DIR 的内容?这将有助于了解 cmake 在您的情况下使用的“路径语法”类型。 - Antonio
我需要这种路径类型,因为我正在使用devkitpro工具链,如果字符串不是该格式,则似乎会引发问题(可能与我的MSYS+MinGW安装有冲突)。在这种情况下它不起作用,因为/c/没有转换成cmake可以理解的内容(这里是C:/)。CMAKE_SOURCE_DIR正在使用c:/。 - Lectem
2个回答

4

目前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}\".")

话虽如此,我同意Antonio的评论,认为需要这样做似乎是不寻常的。


它在以下测试中正常工作:将“/c/my/path/to/a/folder”转换为“c:/my/path/to/a/folder”。 将“c:/my/path/to/a/folder”转换为“c:/my/path/to/a/folder”。 将“/home/my/path/to/a/folder”转换为“/home/my/path/to/a/folder”。 - Lectem
这不会将路径,如/mingw64转换为e:/msys2/mingw64cygpath -w将作为外部进程执行该操作。 - eudoxos

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.bat一样进行适当初始化的情况下运行MSYS shell可能无法工作(特别是在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输出中。我不完全确定这是否必要;在您自己特定的用例中,请自行决定。

嗨,了解msys如何处理路径是非常有趣的,谢谢。这种解决方案唯一的问题当然是它使用了msys,因此不是跨平台的。 - Lectem
当然它不是跨平台的,但是 MSYS 的路径表示形式只在平台为 MSYS 时才有效,因此这直接回答了您最初的问题。如果平台不是 MSYS,则形式“/c/my/path/to/a/folder”可能没有任何有意义的等效项,当将其转换为 MSYS 路径时;如果从任何其他平台交叉编译到 Windows,则您可能不应该首先使用 MSYS 路径表示形式。 - Keith Marshall

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