MSYS2 是一个 Windows 上的软件分发系统和编译平台,它提供了终端仿真器(Terminal Emulator) Minitty 和软件包管理系统(Package Management System) Pacman。

其实关于 MSYS2 我已经在博客之前的文章中[1, 2]有提到过。关于 Windows 下的编译系统我也用过不少,在介绍 MSYS2 前,还是先说一下我使用过的各种编译系统吧。

相关的工具

Cygwin

Cygwin 通过 cygwin1.dll 动态链接库提供一个 UNIX 兼容层,为 Linux 平台编写的软件经过重新编译之后就可以运行在 Windows 上。Cygwin 的优点是完全兼容 Linux 的系统调用,缺点是有一定的性能损失。除此以外,Cygwin 不提供终端模拟器,所以也没有命令行的包管理工具,只能在一个管理界面中勾选需要的软件包。

MinGW

MinGW(Minimalist GNU for Windows),又称 mingw32,是将 GCC 编译器和 GNU Binutils 移植到 Win32 平台下的产物,包括一系列头文件(Win32API)、 库和可执行文件。[3]

MinGW 只能编译产生 32 位的可执行文件,为了能够编译产生 64 位的可执行文件,一些开发人员从 MinGW 创建了支持 64 位的 MinGW-w64 分支项目。MinGW-w64 可以同时支持 32 位和 64 位。

MinGW 和 MinGW-w64 不包含 UNIX 的兼容层,其编译产生的可执行文件是 native 的,所以不需要 cygwin1.dll 动态链接库,执行效率也比 Cygwin 要高。MinGW 和 MinGW-w64 同样也不提供终端模拟器和软件包管理系统。

WSL

WSL 是 Windows Subsystem for Linux 的简称,是微软在 Windows 10 中提供的功能。WSL 提供的功能类似于虚拟机,但是由于其实现方式其性能和易用性要好于虚拟机。WSL 和 对应的 Linux 发行版是二进制兼容的。

Scoop

Scoop 是一个基于 PowerShell 的类似于包管理工具的软件安装工具,可以用来管理 Windows 中的软件。Scoop 可以灵活的选择软件安装位置,同时也不会像 Chocolatey 那样有 UAC 提权弹窗。[4]

原因

MSYS2 其实是将 Cygwin 和 MinGW-w64 组合到了一起,外加提供了终端模拟器和包管理系统。MSYS2 的存在其实可以和 WSL 对比,类似一个 Linux 发行版,这个发行版还可以编译原生的 Windows 可执行文件。MSYS2 中 Cygwin 的性能要比 WSL 差一些,但是 MSYS2 可以提供原生软件的编译功能,所以最后还是选择使用 MSYS2。

安装

安装非常简单,在官网上直接下载安装包,然后安装就好了。安装完成后在安装目录可以看到 3 个终端模拟器的启动文件,分别是 msys2.exemingw64.exemingw32.exemsys2.exe 使用的是 Cygwin 环境,mingw64.exe 使用的 64 位的环境,mingw32.exe 使用的是 32 位的环境。

更新

MSYS2 使用 Pacman 软件管理系统。由于 MSYS2 的软件源在国外,速度较慢,所以更换为国内的软件源镜像。

依次替换软件源配置文件中的软件源:

# /etc/pacman.d/mirrorlist.mingw32
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
# /etc/pacman.d/mirrorlist.mingw64
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64
# /etc/pacman.d/mirrorlist.msys
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch

替换完成后打开终端模拟器,输入 pacman -Syu ,进行更新。等到终端提示关闭终端模拟器时,直接关掉终端管理器窗口,然后重新打开终端模拟器,再次输入 pacman -Syu 并运行。

zsh

MSYS2 的默认 shell 是 bash,如果你喜欢使用 zsh,也可以切换到 zsh。使用 pacman -S zsh 安装 zsh。

与 3 个终端模拟器相对应的有三个终端模拟器的配置文件,msys2.inimingw64.inimingw32.ini。在着三个配置文件中添加如下一行可以将相应终端模拟器的默认 shell 修改为 zsh。

SHELL=/usr/bin/zsh

为了更加愉快的使用 zsh,同样可以运行如下指令安装 oh-my-zsh。

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

与 VSCode 集成

MSYS2 与 VSCode 的继承通过 Shell launcher 来实现。安装好 Shell launcher 之后在 VSCode 设置文件 settings.json 中添加如下内容:

    "shellLauncher.shells.windows": [
        {
            "shell": "C:\\msys64\\usr\\bin\\zsh.exe",
            "label": "MSYS2 MINGW64",
            "args": ["--login", "-i"],
            "env": {
                "MSYSTEM": "MINGW64",
                "CHERE_INVOKING": "1",
                "MSYS2_PATH_TYPE": "inherit"
            }
        },
        {
            "shell": "C:\\msys64\\usr\\bin\\zsh.exe",
            "label": "MSYS2 Cygwin",
            "args": ["--login", "-i"],
            "env": {
                "MSYSTEM": "MSYS2",
                "CHERE_INVOKING": "1",
                "MSYS2_PATH_TYPE": "inherit"
            }
        },
        {
            "shell": "C:\\Windows\\System32\\cmd.exe",
            "label": "cmd"
        },
        {
            "shell": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
            "label": "PowerShell"
        },
        {
            "shell": "C:\\Windows\\System32\\bash.exe",
            "label": "WSL Bash"
        },
        {
            "shell": "C:\\Program Files\\Git\\bin\\bash.exe",
            "label": "Git bash"
        }
    ],

需要使用 MSYS2 终端的时候使用 Ctrl + Shift + P 快捷键启动 VSCode 命令输入窗口,并输入 Shell launcher: Launch ,然后选择需要使用的终端即可。

参考

[1]. 搭建 Pixhawk 飞控固件编译环境
[2]. GLib 简介
[3]. MinGW
[4]. Scoop 助力 PowerShell