以下内容摘自 MinGW-w64 贡献者 Ray Donnelly 的帖子。它对这个主题有所启发,是我问题的重要序言。
有 3 个系统,MSYS2 和 32 位和 64 位 Native Windows 系统。每个系统在 MSYS2 发行版中都有自己的软件包存储库。[...] 这是它们之间的一个重要区别。MSYS2 实现了一个 POSIX-y FHS 文件系统命名空间,这对很多事情都非常重要。
[...] MinGW-w64 32 位和 64 位系统是原生 Windows 软件,分别植根于 /mingw32 和 /mingw64。并不是我们自己替换了每个 Linux API 调用;大多数上游项目都为我们完成了这项工作,因为它们已经提供了 Windows 端口,但是有时我们必须这样做。我们还为许多软件添加了特殊的重定位补丁,这样您就可以在任何您想要的地方自由地安装整个东西的根目录(例如 C:\msys64)。MSYS2 软件不需要这些补丁(因为 Native Windows 位置是隐藏的安装细节),但 MinGW-w64 软件通常需要。
[F] 从最终用户的角度来看,只有 2 个系统,MSYS2 和 XX 位 Native Windows 一个,是的,这两个系统都存在一些软件包。具体来说,MSYS2 的存在是为了运行构建本机 Windows 软件所必需的开发工具,因此如果构建系统需要 Python 或 Perl 的 MSYS2 版本才能正确运行(因为它假设 FHS 或其他),那么我们需要提供这些包。我们从不添加 MSYS2 包而不确保需要它们。如果您不知道自己需要某个 MSYS2 版本,那么请安装相应的 Native Windows 版本。
何时需要 MSYS2 Python 的一个例子是,如果您尝试使用 Google 的 repo 工具。这是因为 repo 使用 fcntl Python 模块,并且该模块仅存在于 POSIX-y 系统上。恕我直言,Python 在抽象操作系统方面做得不好,这是脚本语言应该做的基本事情,fcntl(和 pyWin32)不应该存在,但我不是 Python 的老板。
幸运的是,Pacman 有依赖管理,并且会安装你真正感兴趣的任何包所需的东西
。GNU Autotools 永远不会很好地工作,除非通过带有 POSIX shell 的 FHS 兼容系统,这自然会导致其他工具需要存在于相同的文件系统命名空间,例如 make、perl、m4、bison、flex 等。
鉴于 Ray Donnelly 的帖子,构成系统的首要因素是PATH
变量,因为根据目录优先级,Google 的 repo 工具将使用 MSYS2 或 MinGW 包构建。实际上shell
,在 MSYS2 和 MinGW shell 之间切换的脚本会导出环境变量MSYSTEM
及其参数mingw32|mingw64|msys
和 sources /etc/profile
。后者反过来PATH
根据 的值设置MSYSTEM
。总的来说,对于 MSYS2PATH
是
/usr/local/bin:/usr/bin:/bin
,而对于 MinGW 64 是/mingw64/bin:/usr/local/bin:/usr/bin:/bin
,因此运行 gcc
编译器将相应地执行 MSYS2 或 MinGW 版本。还有其他次要环境。变量也是如此,例如MANPATH
,一旦调用了正确的二进制文件,就可以阅读正确的手册,或者PKG_CONFIG_PATH
在构建时读取正确的 lib 文件。
就pacman
@David Grayson 的评论而言,它不受影响并不完全正确。MSYS2 wiki模糊地确认:
使用 msys2 shell 运行 pacman、makepkg、makepkg-mingw 以及构建您不打算分发的依赖于 POSIX 的软件。使用 mingw shell 构建本机软件和其他任务。
Ray Donnelly 在另一篇文章中再次澄清了这些事情:
一般来说,您可以为 pacman 使用任何 shell,但使用 mingw shell 可能会遇到一些问题,具体取决于您安装到 /mingw32 或 /mingw64 中的软件包,软件包的安装后脚本(它们是任意 bash 脚本)最终可能会运行程序的意外 mingw-w64 变体。一个具体的例子是“sed”。所以从 msys2_shell.bat 运行 pacman 避免了一类潜在的问题(尽管我们会尝试修复任何报告的问题)。
加起来:
由$MSYSTEM
价值决定的其他显着差异是什么?
直接的显着差异在于@David Grayson 确定的路径变量的相关值。
是否有任何二进制文件专门使用此变量?
可以说没有具体的二进制直接读取$MSYSTEM
,但是很多软件使用/读取上面的路径变量是基于$MSYSTEM
.
pacman
受子系统影响?
是的。