Oct 7

MSYS2 简介

简单的说,MSYS2 是 MSYS 的一个升级版, 提供了 GCC 工具链。与 MSYS 最大的区别是移植了 Arch Linux 的软件包管理系统 Pacman。有了 Pacman 升级系统,安装新软件包,还有解决软件包间的依赖问题就变得简单多了。从 http://msys2.github.io/ 下载安装包并安装,安装包的文件名通常为 msys2-<架构>-<日期>.exe ,根据 CPU 架构选择最新的安装包。

MSYS2 设计目标是在 MS Windows 上运行 MinGW 工具链的,它有两套 MinGW 工具链,一个是 mingw32,一个是 mingw64。它们的功能是一样的,都是用于编译 MS Windows 上的代码(能调用 MS Windows 应用程序接口,不能调用 Unix/Linux 系统调用)的,可以生成“纯净”的 win32 和 win64 可执行文件。这些可执行文件运行时只依赖 MS Windows 系统的动态库或静态库。另外,MSYS2 自身还带了一个原生 GCC 工具链,它可用于编译 UNIX/Linux 代码,但支持的函数仅限于 POSIX 部分,其他系统调用都不支持,如 Linux 的 epoll、eventfd 等等,所以功能有限。原生 GCC 工具链可编译生成 MS Windows 平台上的可执行文件,但它们的运行必须依赖 msys2xxx.dll。开发专业应用软件,不要使用 MSYS2 的原生 GCC 工具链,它只是为了编译 MinGW 工具链而存在的,是制造工具的工具。

可以看到 MSYS2 有三个执行脚本,分别是 msys2_shell.bat、mingw32_shell.bat 和 mingw64_shell.bat,查看相应的文件内容可以看到其中的区别。实际上,三个 .bat 的区别就是对环境变量 PATH 的不同设置,mingw32_shell.bat 优先使用 msys64/mingw32 下的工具,mingw64_shell.bat 优先使用 msys64/mingw64 下的工具,而 msys2_shell.bat 两个都不使用,只用自身 msys 的工具(依赖 msys2xxx.dll)。这么做的好处是当需要编译 32 位的项目时使用 mingw32_shell.bat,64 位的项目使用 mingw64_shell.bat,各套工具互不干扰。

配置软件源

需要修改安装目录下,/etc/pacman.d 文件夹中的 mirrorlist.msys、mirrorlist.mingw64、mirrorlist.mingw32 三个文件,分别在文件开始处添加

> notepad /etc/pacman.d/mirrorlist.msys:
##中国科学技术大学开源软件镜像
Server = http://mirrors.ustc.edu.cn/msys2/MSYS2/$arch
##北京理工大学镜像
Server = http://mirror.bit.edu.cn/msys2/REPOS/MSYS2/$arch
##清华大学开源镜像
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch

> notepad /etc/pacman.d/mirrorlist.mingw64:
##中国科学技术大学开源软件镜像
Server = http://mirrors.ustc.edu.cn/msys2/MINGW/x86_64
##北京理工大学镜像
Server = http://mirror.bit.edu.cn/msys2/REPOS/MINGW/x86_64
##清华大学开源镜像
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64

> notepad /etc/pacman.d/mirrorlist.mingw32:
##中国科学技术大学开源软件镜像
Server = http://mirrors.ustc.edu.cn/msys2/MINGW/i686
##北京理工大学镜像
Server = http://mirror.bit.edu.cn/msys2/REPOS/MINGW/i686
##清华大学开源镜像
Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686

提高数据库访问速度

Pacman 将所有软件包的信息放在一一对应的许多小文件中。通过改善数据库访问速度,可以减少花在数据库相关任务上的时间,比如:寻找软件包、检索软件包依赖性。最安全最简单的方法是以root身份运行

$ pacman-optimize

上述命令试图将所有小文件放在磁盘上同一个物理区域,以减少磁头移动。这种方法很安全,但不一定有效。其效果取决于你的文件系统、磁盘使用率、和磁盘碎片程度。另一种更激进的方式是在优化数据库之前首先删除 cache 中所有未安装以及不使用的仓库中的包:

$ pacman -Sc && pacman-optimize

加快下载速度

如果你的包下载速度变得极慢,首先确定你用的是那些(镜像)网站而不是 MSYS2 的官方链接。其次,可以通过各种下载工具而不是 Pacman 内置的下载方式,来改善 Pacman 的下载速度。不论怎样,在做任何修改前,你必须确定拥有了最新版的Pacman:

$ pacman -Syu

对于需要更强大代理支持的用户来说,用 wget 比用 Pacman 自己的下载方式更加方便。要使用 wget,首先使用

$ pacman -S wget

安装它,然后修改 /etc/pacman.conf 并在其中的 [options] 区段将下面内容去掉注释:

$ nano -w /etc/pacman.conf
XferCommand = /usr/bin/wget -c --passive-ftp -c %u

除了将 wget 参数放在 /etc/pacman.conf 里,你也可以直接修改 wget 配置文件(全局文件是/etc/wgetrc,各个用户的文件是 $HOME/.wgetrc)。 如果对于支持断点续传的下载工具还不满足需求,那么可以使用支持多线程的断点下载工具。例如 aria2 是一个具有断点续传和分块下载功能的轻量级下载软件,支持 HTTP/HTTPS/FTP 协议。aria2 可以以多线程的方式通过 HTTP/HTTPS和FTP 协议连接镜像服务器,显著提高下载速度。先使用下述方式

$ pacman -S aria2

安装 aria2。接着修改 /etc/pacman.conf,在 [option] 段添加下列一行(如果已存在则修改之):

$ notepad /etc/pacman.conf
XferCommand = /usr/bin/aria2c --allow-overwrite=true -c --file-allocation=none --log-level=error -m2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=60 -t5 -d / -o %o %u

开启 pacman 的多线程下载之旅吧!

安装必要的工具链和必要的开发库

下面假设使用的是 64 位系统。如果使用的是 32 位系统,仅需后面出现的 x86_64 改为 i686。在 MS Windows 开始菜单中运行 mingw64_shell.bat 以打开命令行窗口。更新本地软件包数据库也即与软件仓库同步:

$ pacman -S --refresh

$ pacman -Sy

然后升级软件包也即更新系统:

$ pacman -S --sysupgrade

$ pacman -Su

通常,将上述命令合二为一

$ pacman -Syu

现在开始安装工具链

$ pacman -S mingw-w64-x86_64-toolchain

如果提示冲突,则使用

$ pacman -S --force mingw-w64-x86_64-toolchain

开发的各种辅助工具

$ pacman -S base-devel

安装 GTK+-3 的库

$ pacman -S --force mingw-w64-x86_64-gtk3

安装 GTK+ 快速构建工具 Glade 包

$ pacman -S --force mingw-w64-x86_64-glade3

安装 wxWidgets 的库

$ pacman -S --force mingw-w64-x86_64-wxWidgets

安装 OpenGL 库(虽然微软操作系统自带了 OpenGL 库,为了与 MSYS2 相容,选用 GLEW、FreeGLUT 库)

$ pacman -S --force mingw-w64-x86_64-glew mingw-w64-x86_64-freeglut

pacman 的常用用法

查看 pacman 工具帮助

$ pacman -h
$ pacman -S -h

列出本地 pacman 软件包数据库中的软件包清单

$ Pacman -Sl

列出所有已安装的软件包

$ pacman -Q --explicit

或者

$ pacman -Q -e

或直接

$ pacman -Q

安装新的软件包或软件组

$ pacman -S 

比如我要安装 gcc,那么执行:

$ pacman -S gcc

很多时候,我们不知道要安装软件的准确名称,这时就要先查询软件包的名称。

$ pacman -Ss 

比如我想安装 gcc 相关的软件,那么可以这样搜索

$ pacman -Ss gcc

可以列出所有的软件组

$ pacman -Q --groups

或者

$ pacman -Q -g

查看软件组

$ pacman -S -g

查看软件组包含的软件

$ pacman -Q -g 

例如

$ pacman -Q -g base-devel

查询软件包的内容

$ pacman -Q -l 

例如查询软件包 gtk+ 的内容

$ pacman -Q -l gtk+

查询软件所在的软件包或软件组

$ pacman -Q -s 

例如

$ pacman -Q -s nettle

强制安装某个包(不管是否已安装)

$ pacman -Sf nettle

更新系统但不升级某个包

$ pacman -Su --ignore mysql

删除一个软件包

$ pacman -R 

例如删掉某个包但忽略无用依赖的删除

$ pacman -R glade3

删除指定软件包,及其所有没有被其他已安装软件包使用的依赖关系:

$ pacman -Rs mysql

清理当前未被安装软件包的缓存(/var/cache/pacman/pkg):

$ pacman -Sc

清理所有下载的包与数据库

$ pacman -Scc

下载包而不安装它

$ pacman -Sw mysql