msys2 shells
msys2 installs 3 different shells on the system: msys, mingw32, mingw64; which one should i use? this is a classic question, whose best answer i have seen so far is a post on sourceforge; however, it is a very long answer; here i want to give some brief explanation, saving readers some time;
what is msys2
msys2 stands for minimal system 2, which is a mininal environment for building native windows software; msys2 is based on:
-
cygwin: a posix compatibility layer on windows;
-
mingw-w64: a cross compiler and related tools, targeting windows build;
msys2 is designed to create an environment for users to comfortably run cross
compilers such as mingw-w64; msys2 also provides useful tools, such as bash
shell, autotools, package manager, etc., to facilitate software building; many
of these tools come from the unix world and require posix compatibility; msys2
provides posix compatibility with its msys-2.0.dll
, which is derived from
cygwin1.dll
in the cygwin project; informally, you can think of msys2 as a
“small cygwin” that provides mingw-w64 and other related tools for building
native windows software;
compiler toolchains
msys2 provides 3 compiler toolchains:
-
/usr/bin/gcc
:this toolchain produces binary linked to msys2 posix compatibility layer; running
ldd
on the binary says it is linked withmsys-2.0.dll
; you can run the compiled binary in msys2, but not in windows cmd; -
/mingw32/bin/gcc
;this toolchain produces native windows 32-bit binary; running
ldd
on the binary says it is linked withmsvcrt.dll
, notmsys-2.0.dll
; you can run the compiled binary in msys2, and in windows cmd; -
/mingw64/bin/gcc
;this toolchain produces native windows 64-bit binary; running
ldd
on the binary says it is linked withmsvcrt.dll
, notmsys-2.0.dll
; you can run the compiled binary in msys2, and in windows cmd;
in short, the mingw toolchains build more “native” binaries, in that they dont
depend on the msys2 posix compatibility library msys-2.0.dll
; these “native”
binaries are the “end” products that msys2 was designed for; binaries compiled
with the posix toolchain are often tools used internally in the msys2
environment;
shells
as we said, msys2 provides 3 shells; they set different environment variables to pick different toolchains and are configured for specific purposes:
-
msys
:gcc
points to/usr/bin/gcc
;use this shell for most maintenance jobs in msys2: running pacman, etc.;
-
mingw32
:gcc
points to/mingw32/bin/gcc
;use this shell for cross compiling native 32-bit windows software;
-
mingw64
:gcc
points to/mingw64/bin/gcc
;use this shell for cross compiling native 64-bit windows software;
in short, most of the time, you want to be in the msys
shell; open a mingw
shell when you want to cross compile native windows software;
packages
you may also wonder why some packages, such as curl
, exist in both msys
and
mingw
repos;
first, as you can guess, the msys
one was compiled using the posix toolchain,
while the mingw
one was compiled using the mingw toolchain; the former is a
posix build, the latter is a win32 build; there is no guarantee that these two
variants will always give the same result; even if they do, their performance
may vary; because the mingw
build is more native, it usually runs faster than
the msys
build; this difference is more noticeable between msys
git and
mingw
git;
second, if you list their file contents, you will often find the msys
package
contains only executables, but the mingw
package also contains dev files
(headers and libs) in addition to executables; if you are simply using curl as a
tool, both should work; however, if you are developing your own software that
depends on libcurl, then you have to download the mingw
package;
as a rule of thumb, when the same software exists in multiple repos, the msys
repo is your default choice; use the mingw
repo if the msys
variant gives a
performance problem, or you need dev files as build dependencies;