1.环境搭建
最近msys2的软件源进行了更新,一些低版本的软件都没有了,gcc只有9.3以上版本,gdb只有9.1以上版本,没有低版本,那以后只能跟着软件源的最新版本走了,如果碰到软件依赖版本不兼容将会是一个非常棘手的问题,而且gcc和gdb正在狂热的将c代码都替换为c++,但是我本人不太喜欢c++,所以尝试搭建一个不依赖软件源的平台。
清华和腾讯开源镜像都已经随着官方的源更新了,幸好华为和浙大的镜像还没更新,但是迟早也会更新的,所以在他们更新之前赶紧把这个事情做了。
基础安装包,我用的是msys2-base-x86_64-20190524.tar.xz,解压即可,先把/etc/pacman.d的镜像源都注释掉,不要在线安装,全部选择把包下载到本地离线安装(以后不一定还能下到低版本的包,接下来的一步就是安装gcc,我用的是gcc-7.4.0-1-x86_64.pkg.tar.xz,msys2进入到包所在目录,执行
pacman -U gcc-7.4.0-1-x86_64.pkg.tar.xz
出现下列窗口
先按n不要安装,去华为镜像找到对应的版本的包都下下来,源码最好也下一下,进到包所在目录安装
pacman -U binutils-2.30-1-x86_64.pkg.tar.xz isl-0.19-1-x86_64.pkg.tar.xz mpc-1.1.0-1-x86_64.pkg.tar.xz msys2-runtime-devel-3.0.7-2-x86_64.pkg.tar.xz msys2-w32api-headers-7.0.0.5454.19e51f59-1-x86_64.pkg.tar.xz msys2-w32api-runtime-7.0.0.5454.19e51f59-1-x86_64.pkg.tar.xz windows-default-manifest-6.4-1-x86_64.pkg.tar.xz
接下来就可以去装gcc了:
pacman -U gcc-7.4.0-1-x86_64.pkg.tar.xz
接下来装make
pacman -U make-4.2-1-x86_64.pkg.tar.xz
pacman -U expat-2.2.6-1-x86_64.pkg.tar.xz gdbm-1.18.1-2-x86_64.pkg.tar.xz libgdbm-1.18.1-2-x86_64.pkg.tar.xz python2-2.7.16-1-x86_64.pkg.tar.xz
运行gdb后如果出现下面这个错误
#gdb -v D:/d/msys64/usr/bin/gdb.exe: error while loading shared
libraries: msys-readline6.dll: cannot open shared object file: No such
file or directory
需要把readline降级为libreadline-6.3版本
pacman -U libreadline-6.3.008-7-x86_64.pkg.tar.xz
这样gdb可以用了,但是此后使用pacman命令会出现了下面这个错误
错误:GPGME 错误:无效的加密引擎
错误:GPGME 错误:无效的加密引擎
错误:GPGME 错误:无效的加密引擎
错误:数据库 'mingw32' 无效 (无效或已损坏的数据库 (PGP 签名))
错误:数据库 'mingw64' 无效 (无效或已损坏的数据库 (PGP 签名))
错误:数据库 'msys' 无效 (无效或已损坏的数据库 (PGP 签名))
这个问题是不可逆,仔细想一下,原始包里的是msys-readline8.dll,安装后msys-readline8.dll被删替换为msys-readline6.dll,这样大量依赖msys-readline8.dll的软件都不能使用,包括pacman。所以一种补救的方法是把msys-readline8.dll从原始包里重新拷贝到/usr/bin里。其实最好的方法是之前就不要安装libreadline-6.3,直接把msys-readline8.dll拷贝一份改名为msys-readline6.dll。
这样就搭建好了最基本的环境,接下来分别去源码编译gdb、gcc和gdb来验证环境的可用性。
2.gdb源码编译
编译的版本是7.9,因为我以前编译过,所以坑就不走,直接一步到位,先下载依赖包然后一次性安装
pacman -U gettext-devel-0.19.8.1-1-x86_64.pkg.tar.xz libexpat-devel-2.2.6-1-x86_64.pkg.tar.xz libiconv-devel-1.15-1-x86_64.pkg.tar.xz liblzma-devel-5.2.4-1-x86_64.pkg.tar.xz libreadline-devel-8.0.000-1-x86_64.pkg.tar.xz ncurses-devel-6.1.20180908-1-x86_64.pkg.tar.xz zlib-devel-1.2.11-1-x86_64.pkg.tar.xz patch-2.7.6-1-x86_64.pkg.tar.xz
把gdb-7.9-2.src.tar.gz 解压后进入目录,执行
makepkg --skippgpcheck
本来不想踩坑的,还是踩到了,出现如下错误
checking for XML_StopParser… yes checking whether to use python…
/usr/bin/python2 checking for python2.7… no configure: error: no
usable python found at /usr/bin/python2 make[1]: ***
[Makefile:8648:configure-gdb] 错误 1 make[1]:
离开目录“/d/source/gdb-7.9-2/src/gdb-7.9” make: *** [Makefile:841:all] 错误
2
==> 错误: 在 build() 中发生一个错误。
正在放弃…
之前装的python2-2.7.16版本太高了,要装python2-2.7.13的版
再编译就能成功了,可执行文件都生成了,但是check()出错,所以无法打包,可以把check()里面的make check注释掉
3.gcc源码编译
第一步还是先安装所有依赖包
pacman -U gmp-devel-6.1.2-1-x86_64.pkg.tar.xz mpc-devel-1.1.0-1-x86_64.pkg.tar.xz mpfr-devel-4.0.2-1-x86_64.pkg.tar.xz isl-devel-0.19-1-x86_64.pkg.tar.xz diffutils-3.5-1-x86_64.pkg.tar.xz
然后进入gcc-7.4.0-1.src.tar.gz源码解压后的目录,执行
makepkg --skippgpcheck
编译时还是出现这个老问题
mv: 无法将'gcc' 移动至'stage1-gcc': Permission denied
mv: 无法将'gcc' 移动至'stage1-gcc': Permission denied
mv: 无法将'gcc' 移动至'stage1-gcc': Permission denied
make[4]: *** [Makefile:21569:stage1-end] 错误 1
make[4]: 离开目录“/d/source/gcc-7.4.0-1/src/build-x86_64”
mv: 无法将'gcc' 移动至'stage1-gcc': Permission denied
mv: 无法将'gcc' 移动至'stage1-gcc': Permission denied
make[4]: *** [Makefile:21569:stage1-end] 错误 1
有的电脑行,有的电脑死活不行,但是不管怎么样,反正都在build-x86_64\gcc生成了xgcc.exe和cc1.exe文件,有这2个就可以编译了。
重新用gcc-7.3.0-1的包试了一下是可以编译并安装成功的。经过反复的验证并不是版本的问题,gcc-7.3之所以能成功是因为我把PKGBUILD中的make改为了make -j24,这样之后其他版本也能成功了,电脑多少核就用多少核编译。
现在来编译mingw-w64-gcc-7.4.0-1.src.tar.gz的代码,因为是mingw的软件,需要在mingw64.exe里编译,现在通过在线的方式安装依赖包,需要在/etc/pacman.d里配好源路径,至于为什么选择在线的方式,后续说明,首先安装依赖
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-ada mingw-w64-x86_64-binutils mingw-w64-x86_64-crt mingw-w64-x86_64-headers mingw-w64-x86_64-isl mingw-w64-x86_64-windows-default-manifest mingw-w64-x86_64-winpthreads
出现了如下莫名奇妙的错误
错误:mingw64: 密钥 "4A6129F4E4B84AE46ED7F635628F528CF3053E04" 未知
错误:无法远程查找到密钥 "4A6129F4E4B84AE46ED7F635628F528CF3053E04"
错误:msys: 密钥 "4A6129F4E4B84AE46ED7F635628F528CF3053E04" 未知
错误:无法远程查找到密钥 "4A6129F4E4B84AE46ED7F635628F528CF3053E04"
错误:数据库 'mingw64' 无效 (无效或已损坏的数据库 (PGP 签名))
错误:数据库 'msys' 无效 (无效或已损坏的数据库 (PGP 签名))
这个错误,下面这篇文章可以完全解决
解决msys2“无法升级 mingw64 (无效或已损坏的数据库 (PGP 签名))”密钥失效问题
解决后依赖就可以装上了,然后进入到mingw-w64-gcc-7.4.0-1源码目录,执行
makepkg --skippgpcheck
出现这个错误
# makepkg --skippgpcheck
==> 正在创建软件包:mingw-w64-gcc 7.4.0-1 (2020年10月24日 13:51:08)
==> 正在检查运行时依赖关系...
==> 正在检查编译时依赖关系
==> 缺少依赖关系:-> mingw-w64-x86_64-gcc-> mingw-w64-x86_64-gcc-ada-> mingw-w64-x86_64-binutils-> mingw-w64-x86_64-crt-> mingw-w64-x86_64-headers-> mingw-w64-x86_64-isl-> mingw-w64-x86_64-windows-default-manifest-> mingw-w64-x86_64-winpthreads
==> 错误: 无法解决所有的依赖关系。
安装相关的依赖再编译,还是没成功,报的这个莫名奇妙错误
x86_64-w64-mingw32-gcc -c -g -gnatp -gnatws -nostdinc -I- -I. -Iada/generated -Iada -I../../gcc-7.4.0/gcc/ada -I../../gcc-7.4.0/gcc/ada/gcc-interface \ada/b_gnat1.adb -o ada/b_gnat1.o
In file included from ../../gcc-7.4.0/gcc/system.h:691,from ../../gcc-7.4.0/gcc/read-rtl.c:31:
../../gcc-7.4.0/gcc/read-rtl.c: In member function 'const char* md_reader::apply_iterator_to_string(const char*)':
../../gcc-7.4.0/gcc/../include/libiberty.h:727:33: warning: type qualifiers ignored on cast result type [-Wignored-qualifiers]727 | char *const libiberty_nptr = (char *const) alloca (libiberty_len); \| ^
../../gcc-7.4.0/gcc/read-rtl.c:380:21: note: in expansion of macro 'ASTRDUP'380 | base = p = copy = ASTRDUP (string);| ^~~~~~~
b_gnat1.adb:174:79: "SS_Stack" not declared in "Secondary_Stack"
b_gnat1.adb:174:89: incorrect constraint for this kind of type
b_gnat1.adb:269:56: "Runtime_Default_Sec_Stack_Size" not declared in "Parameters"
make[3]: *** [../../gcc-7.4.0/gcc/ada/gcc-interface/Make-lang.in:949:ada/b_gnat1.o] 错误 1
make[3]: *** 正在等待未完成的任务....
rm gcc.pod
make[3]: 离开目录“/d/d/msys2package/source/mingw-w64-gcc-7.4.0-1/src/build-x86_64-w64-mingw32/gcc”
make[2]: *** [Makefile:4549:all-stage1-gcc] 错误 2
make[2]: 离开目录“/d/d/msys2package/source/mingw-w64-gcc-7.4.0-1/src/build-x86_64-w64-mingw32”
make[1]: *** [Makefile:22283:stage1-bubble] 错误 2
make[1]: 离开目录“/d/d/msys2package/source/mingw-w64-
换了mingw原版的编译器也是这个错误,看来可能还少什么库没安装,这个问题暂时不管了,至少msys2的gcc是能编成功的。
4. gtk3源码编译
源码包是mingw-w64-gtk3-3.22.30-1.src.tar.gz,出现如下错误
# makepkg --skippgpcheck
==> 错误: 文件 install (gtk3-x86_64.install) 不存在,或者不是一个常规文件。
把gtk3-i686.install改为gtk3-x86_64.install,并把里面的mingw32替换为mingw64
编译器需要改成mingw-w64-x86_64-gcc 8.3.0-2,msys2的编译器无法成功
先安装相关依赖
pacman -S mingw-w64-x86_64-adwaita-icon-theme mingw-w64-x86_64-atk mingw-w64-x86_64-cairo mingw-w64-x86_64-gdk-pixbuf2 mingw-w64-x86_64-gdk-pixbuf2 mingw-w64-x86_64-glib2 mingw-w64-x86_64-json-glib mingw-w64-x86_64-libepoxy mingw-w64-x86_64-pango mingw-w64-x86_64-shared-mime-info mingw-w64-x86_64-pkg-config mingw-w64-x86_64-gtk-doc mingw-w64-x86_64-gobject-introspection autoconf automake libtool
再makepkg –skippgpcheck,目前已编译通过。
5. 重新开始
之前包我是从网页上一个一个下下来的,其实有更快速的方法:
pacman -Sw 包名
下的包可以在/var/cache/pacman/pkg/里找到。
安装时也不用把依赖一个个都装过去,把/etc/apcman.d里的源路径改为本地路径,类似Server = file:///home/custompkgs这样的,然后就会自动安装依赖。
下面是我自己记录的操作步骤:
1 .解压msys2-base-x86_64-20190524.tar文件
2.修改/etc/apcman.的源为本地文件夹
Server = file:///d/d/msys2package/all
3.安装gcc、make、gdb
pacman -U /d/d/msys2package/all/gcc-7.4.0-1-x86_64.pkg.tar.xz
pacman -U /d/d/msys2package/all/make-4.2-1-x86_64.pkg.tar.xz
pacman -U /d/d/msys2package/all/gdb-7.9-2-x86_64.pkg.tar.xz
4.复制msys-readline8.dll并重命名为msys-readline6.dll
5.编译gdb
安装依赖
pacman -U gettext-devel-0.19.8.1-1-x86_64.pkg.tar.xz libexpat-devel-2.2.6-1-x86_64.pkg.tar.xz libiconv-devel-1.15-1-x86_64.pkg.tar.xz liblzma-devel-5.2.4-1-x86_64.pkg.tar.xz libreadline-devel-8.0.000-1-x86_64.pkg.tar.xz ncurses-devel-6.1.20180908-1-x86_64.pkg.tar.xz zlib-devel-1.2.11-1-x86_64.pkg.tar.xz patch-2.7.6-1-x86_64.pkg.tar.xz python2-2.7.13-1-x86_64.pkg.tar.xz
进入源码目录
cd /d/d/msys2package/source/gdb-7.9-2
编译:makepkg –skippgpcheck
成功!!(最后check()报错不用管,只要build()成功生成可执行文件就可以了
6.编译gcc
修改PKGBUILD文件
#STRIP_OPTION=“strip”
STRIP_OPTION="!strip"
DEBUG_OPTION=“debug”
#DEBUG_OPTION="!debug"
安装依赖
pacman -U gmp-devel-6.1.2-1-x86_64.pkg.tar.xz mpc-devel-1.1.0-1-x86_64.pkg.tar.xz mpfr-devel-4.0.2-1-x86_64.pkg.tar.xz isl-devel-0.19-1-x86_64.pkg.tar.xz diffutils-3.5-1-x86_64.pkg.tar.xz
进入源码目录:cd /d/d/msys2package/source/gcc-7.3.0-1/
编译:makepkg –skippgpcheck
这次失败了,还是这个错误
mv: 无法将’gcc’ 移动至’stage1-gcc’: Permission denied
把PKGBUILD里的make改为make -j24就可以了,版本7.3,7.4,9.3都可以
7.安装gtk
pacman -U /d/d/msys2package/all/mingw-w64-x86_64-gtk3-3.22.30-1-any.pkg.tar.xz
8. 编译gtk
安装mingw-gcc
pacman -U /d/d/msys2package/all/mingw-w64-x86_64-gcc-8.3.0-2-any.pkg.tar.xz
安装依赖
pacman -S mingw-w64-x86_64-adwaita-icon-theme mingw-w64-x86_64-atk mingw-w64-x86_64-cairo mingw-w64-x86_64-gdk-pixbuf2 mingw-w64-x86_64-gdk-pixbuf2 mingw-w64-x86_64-glib2 mingw-w64-x86_64-json-glib mingw-w64-x86_64-libepoxy mingw-w64-x86_64-pango mingw-w64-x86_64-shared-mime-info mingw-w64-x86_64-pkg-config mingw-w64-x86_64-gtk-doc mingw-w64-x86_64-gobject-introspection autoconf automake libtool
把gcc卸掉 ,再重新启动mingw64.exe,可以看到gcc版本变为mingw-gcc 8.3
进入mingw-w64-gtk3.22源码目录,编译makepkg –skippgpcheck
成功!!