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