30

MSYS2 默认 shell (bash) 可以在三个启动器中选择启动,这些启动器还设置了环境变量MSYSTEM。具体来说:

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

除了 shell 的提示外,明显的区别是:

  • $MSYSTEM导出了一个等效的 shell 变量;
  • uname输出基于$MSYSTEM
  • 什么时候$MSYSTEMMINGW*/mingw*/bin的第一条路径$PATH

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

  • $MSYSTEM价值决定的其他显着差异是什么?
  • 是否有任何二进制文件专门使用此变量?
  • pacman受子系统影响?
4

4 回答 4

25

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

于 2016-12-26T00:00:05.477 回答
13

这三种选择背后的目的是为您提供两种不同的开发环境的选择:

  1. MinGW:用于开发原生 Windows 应用程序。这又分为:

    • Mingw32 用于生成 32 位可执行文件,当然还有
    • Mingw64 用于生成 64 位可执行文件

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

  2. MSYS:旨在构建将在具有 FHS 样式文件系统命名的 posix-y 环境中运行的应用程序。将此视为您将在 Msys2 中实际运行的工具进行开发的地方。或者,您可以像 Cygwin 一样考虑这一点。

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

于 2016-12-25T04:03:21.377 回答
5

您应该查看/etc/profile(来自GitHub 上的这个文件)。在那里你可以看到MSYSTEM影响:

  • PATH
  • PKG_CONFIG_PATH
  • ACLOCAL_PATH
  • MANPATH
  • MINGW_MOUNT_POINT

此外,还有一个添加的拉取请求/etc/profile/msystem,这将是一个基于MSYSTEM.

于 2016-05-26T15:30:09.590 回答
1

$MSYSTEM 值决定的其他显着差异是什么?

作为记录,pythonos.path.sep是不同的,如下所述:https ://github.com/msys2/MSYS2-packages/issues/1591#issuecomment-573336696

这意味着根据您使用的 shell,您的路径将由Python 路径分隔\或位于其中。/

于 2021-04-08T12:57:56.053 回答