MSYS与MinGW:内部环境变量

时间:2016-05-26 11:49:44

标签: mingw msys mingw-w64 msys2

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

  1. msys2_shell.bat将其设置为MSYS
  2. mingw64_shell.bat将其设置为MINGW64
  3. mingw32_shell.bat将其设置为MINGW32
  4. 除了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 个答案:

答案 0 :(得分:15)

以下内容摘自MinGW-w64撰稿人Ray Donnelly的post。它启发了这个主题,是我的问题的重要序言。

  

有3个系统,MSYS2以及32位和64位Native Windows系统。每个系统在MSYS2发行版中都有自己的软件包存储库。 [...]这是他们之间的重要区别。 MSYS2实现了POSIX-y FHS文件系统命名空间,这对很多事情都非常重要   [...]   MinGW-w64 32位和64位系统是Native Windows软件,它们分别以/ mingw32和/ mingw64为根。这不像我们自己替换每个Linux API调用;大多数上游项目都为我们工作,因为他们已经提供了Windows端口,但有时我们必须这样做。我们还为许多软件添加了特殊的重定位补丁,以便您可以随意在任何地方安装根目录(例如C:\ msys64)。 MSYS2软件不需要这些补丁(因为Native Windows位置是一个隐藏的安装细节),但MinGW-w64软件经常这样做。
  [F]从最终用户的角度来看,只有2个系统,MSYS2和XX位Native Windows 1,是的,这些系统都存在一些软件包。具体来说,MSYS2用于运行构建Native Windows软件所需的开发工具,因此如果构建系统需要MSYS2版本的Python或Perl才能正常运行(因为它假定为FHS或其他),那么我们需要提供这些软件包。我们从不添加MSYS2包而不确定是否需要它们。如果你不知道你需要MSYS2版本的东西,那么请安装相应的Native Windows   如果您尝试使用Google的repo工具,那么您何时需要MSYS2 Python的示例。这是因为repo使用fcntl Python模块,该模块仅存在于POSIX-y系统上。恕我直言Python在这里抽象操作系统做得很糟糕,这是脚本语言应该做的基本事情,fcntl(和pyWin32)不应该存在,但我不是Python的老板。
  幸运的是,Pacman有依赖管理,并会安装你真正感兴趣的任何软件包所需的东西   除了通过具有POSIX shell的FHS兼容系统之外,GNU Autotools永远不会正常工作,这自然会导致需要存在于同一文件系统命名空间中的其他工具,例如make,perl,m4,bison,flex等等。

鉴于Ray Donnelly的帖子,组成系统的首要问题是PATH变量,因为根据目录优先级,Google的repo工具将使用MSYS2或MinGW软件包构建。 事实上,在MSYS2和MinGW shell之间切换的shell脚本使用其参数MSYSTEM和源mingw32|mingw64|msys导出环境变量/etc/profile。反过来,后者根据PATH的值设置MSYSTEM。对于MSYS2来说,PATH基本上是 /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在另一个post中再次澄清了这些事情:

  

一般来说,你可以使用任何shell作为pacman,但是你可能会遇到一些问题,使用mingw shell,这取决于你安装到/ mingw32或/ mingw64的软件包,软件包的安装后脚本(这是任意的) bash脚本)可能最终运行程序的意外mingw-w64变体。一个具体的例子是'sed'。所以从msys2_shell.bat运行pacman避免了一类潜在的问题(尽管我们试图解决任何报告的问题)。

总结:

$MSYSTEM值确定的其他重要差异是什么?
直接的显着差异在于@David Grayson确定的路径变量的相关值。

是否有任何二进制文件专门使用此变量?
似乎可以肯定地说没有特定的二进制读取直接$MSYSTEM,但是很多软件基于$MSYSTEM使用/读取上面的路径变量。

pacman受子系统的影响吗?
是。

答案 1 :(得分:10)

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

  1. MinGW:用于开发本机Windows应用程序。这进一步分为:

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

    将此视为您最终用户开发的目标。通常不会在MSYS2环境中运行的软件。

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

  3. 您可以在MSYS2 sourceforge论坛的this thread中获得有关此主题的更多信息。

答案 2 :(得分:3)

您应该查看/etc/profile(来自this file on GitHub)。在那里,您可以看到MSYSTEM影响:

  • PATH
  • PKG_CONFIG_PATH
  • ACLOCAL_PATH
  • MANPATH
  • MINGW_MOUNT_POINT

此外,还有pull request添加/etc/profile/msystem,这是一个根据MSYSTEM设置其他变量的脚本。

答案 3 :(得分:1)

<块引用>

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

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

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