MSYS与MinGW:内部环境变量

33

MSYS2默认shell(bash)可以通过选择三种启动器之一来启动,并设置环境变量MSYSTEM。具体而言:

  1. msys2_shell.bat将其设置为MSYS
  2. mingw64_shell.bat将其设置为MINGW64
  3. mingw32_shell.bat将其设置为MINGW32

除了Shell提示之外,可见的区别是:

  • 有一个等效的Shell变量$MSYSTEM被导出
  • uname输出基于$MSYSTEM
  • $MSYSTEMMINGW *时,/mingw*/bin$PATH中的第一个路径。

假设我们有/usr/bin/gcc/mingw64/bin/gcc/mingw32/bin/gcc,则设置$MSYSTEM的合理结果是使用不同的编译器生成不同的二进制文件(POSIX或本机32/64位)。

  • $MSYSTEM值确定的其他重要差异是什么?
  • 是否有任何二进制文件对此变量进行特定用途?
  • pacman是否受子系统影响?
4个回答

29
以下内容摘自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受子系统影响吗?
是的。


15
三个选择的意图是给您提供两种不同的开发环境:
  1. MinGW: 旨在用于本机Windows应用程序的开发。 这进一步分为:

    • Mingw32 用于生成32位可执行文件,
    • Mingw64 则用于生成64位可执行文件。

    将其视为您进行最终用户开发的地方。通常不会在MSYS2环境本身内运行的软件。

  2. MSYS:旨在构建将在类Unix环境中具有FHS风格的文件系统命名的应用程序。将其视为您在Msys2内实际运行的工具的开发场所。或者,您可以像对待Cygwin一样来思考。

您可以在MSYS2 sourceforge论坛上的此线程中获取有关此主题的更多信息。


我已经意识到了这一点,但这并没有明确回答我的问题。无论如何,Ray Donnelly的链接解决了问题。 - antonio

6
您应该查看位于GitHub上的此文件,即/etc/profile(来自此处的文件)。在那里,您可以看到MSYSTEM会影响以下内容:
  • PATH
  • PKG_CONFIG_PATH
  • ACLOCAL_PATH
  • MANPATH
  • MINGW_MOUNT_POINT
此外,有一个pull请求添加了/etc/profile/msystem,这将是一个脚本,根据MSYSTEM设置其他变量。

这意味着,在制作过程中,pkg-configautomake可以在/mingwXX而不是/usr中查找.pc.m4文件。这也应该影响到pacman的构建过程。因此,pacman的输出是否会根据$MSYSTEM而改变? - antonio
pacman 不会构建软件包,它只是安装它们。无论 $MSYSTEM 设置为什么,您都可以正常运行 pacman,据我所知 $MSYSTEM 不会影响它。 - David Grayson

1

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