sci

最果て風呂

pacman -Syu でハマる

サポート終了からそろそろ 3 年になる Windows XP。「えっ!もうそんなんなるぅ?」と驚いてしまう程に時が経つのは早いのですが、今でも私は使っています。今回は MSYS MinGW について、ちょっとした顛末を記事にします。

私はパソコンにあまり詳しくないのですが、過去に次の記事で MSYS MinGW について取り上げました。

2013 年の時とくらべて MSYS2 になった 2015 年の方が、格段とインストールがしやすくなりました。pacman の存在が大きいのだと思います。gempip と同じように手軽に使えるので、ついつい無駄に pacman -Syu をしてしまいました。

これが原因なのか、不具合が発生するようになりました。まずは昨年の 6 月にこんなことが……

msys をアップデートしたからなのか、Vim がビルドできなくなってしまった。

gcc -c -Iproto -DWIN32 -DWINVER=0x0501 -D_WIN32_WINNT=0x0501 -DHAVE_PATHDEF -DFEAT_HUGE -DHAVE_GETTEXT -DHAVE_LOCALE_H -DDYNAMIC_GETTEXT -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG -DFEAT_JOB_CHANNEL -DFEAT_GUI_W32 -DFEAT_CLIPBOARD -DFEAT_MBYTE -DFEAT_MBYTE_IME -DDYNAMIC_IME -DDYNAMIC_ICONV -pipe -march=i386 -Wall -DFEAT_XPM_W32 -I xpm/x86/include -I xpm/x86/../include -O3 -fomit-frame-pointer -freg-struct-return -s eval.c -o gobji386/eval.o
eval.c: In function ‘f_filereadable’:
eval.c:11758:2: warning: implicit declaration of function ‘close’ [-Wimplicit-function-declaration]
close(fd);
^
eval.c: In function ‘modify_fname’:
eval.c:26887:16: error: ‘MAX_PATH’ undeclared (first use in this function)
p = alloc(MAX_PATH + 1);
^
eval.c:26887:16: note: each undeclared identifier is reported only once for each function it appears in
make: *** [Make_cyg_ming.mak:853: gobji386/eval.o] Error 1

Vim 側に問題があるのかと思って、そのまま放置することにしました。この時期は色々とバタバタしていたのです。

そして昨年の 10 月に再挑戦しました。しかし結果は……

久しぶりに Vim をアップデートしてみたけれど、コンパイルエラーが出てビルドができない。6 月と同じもの。と思ったけれど、若干違うみたい。

gcc -c -Iproto -DWIN32 -DWINVER=0x0501 -D_WIN32_WINNT=0x0501 -DHAVE_PATHDEF -DFEAT_HUGE -DHAVE_STDINT_H -DHAVE_GETTEXT -DHAVE_LOCALE_H -DDYNAMIC_GETTEXT -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG -DFEAT_JOB_CHANNEL -DFEAT_GUI_W32 -DFEAT_CLIPBOARD -DFEAT_MBYTE -DFEAT_MBYTE_IME -DDYNAMIC_IME -DDYNAMIC_ICONV -pipe -march=i386 -Wall -DFEAT_XPM_W32 -I xpm/x86/include -I xpm/x86/../include -O3 -fomit-frame-pointer -freg-struct-return -s eval.c -o gobji386/eval.o
eval.c: In function ‘modify_fname’:
eval.c:9608:16: error: ‘MAX_PATH’ undeclared (first use in this function)
p = alloc(MAX_PATH + 1);
^
eval.c:9608:16: note: each undeclared identifier is reported only once for each function it appears in
make: *** [Make_cyg_ming.mak:873: gobji386/eval.o] Error 1

こうなると MSYS2 MinGW 側を疑うしかありません。とりあえず pacman -Syu を実行します。何はなくても pacman -Syu です。するとどうでしょう?なんとまぁ、うんともすんとも言わなくなったではありませんか。正確にはコマンドプロンプト画面が一瞬だけ表示されて消えます。これではコマンドを入力してパッケージのダウングレードすらできません(>_<)。

手詰りになってしまったので最新版 msys2-i686-20161025.exe (62.6MB) をダウンロードしてインストールすることにしました。データ SIM でやりくりしているので、この容量のダウンロードはかなりキツいです……。

100 KiB/s 程度の速度なので 10 分以上かかってしまいましたが、無事にダウンロードすることができました。早速、ダブルクリックをしてインストールを開始します。しかし……

プロシージャ エントリ ポイント CancelSynchronousIo がダイナミック リンク ライブラリ KERNEL32.dll から見つかりませんでした。

というエラーで進まない……。時間と容量が無駄になってしまった(>_<)。

しばらく放心状態を経験したのち、時間を巻き戻すため「Windows XP に MSYS2 をインストールした」で用いたアーカイブを展開することから再スタートすることにしました。

MSYS MinGW 環境が無くなったため、Windows XP では xz を展開することが出来ません。そこでファイル共有をして MBP から msys2-base-i686-20150916.tar.xz をダブルクリック。アーカイブユーティリティ.app が起動して、無事解凍することができました。ネットワーク越しなのでとてつもなく遅かったですが。

同じ轍を踏んではいけませんので、ここから先は慎重に進めることにします。正規表現の鬼が MinGW について何か書いていたことを思い出し、この記事を流し読みしつつ、さらに検索で一番目にあったあの記事を読んで

あかん!むやみに pacman -Syu したら

ということを理解しました。

とりあえず update-core をしてみると、下記のようにアップデートは無いそうです。

==> Update package databases...
:: Synchronizing package databases...
 mingw32 is up to date      0.0   B  0.00B/s 00:00 [---------------------]   0%
 msys is up to date         0.0   B  0.00B/s 00:00 [---------------------]   0%
==> Checking if there are critical packages to upgrade.
==> No updates for core packages.

とにもかくにも Vim をビルドしたいので開発環境をインストールします(ひ、ひゃくメガ!お風呂はいろ)。

pacman -S mingw-w64-i686-toolchain (105MiB)

ターミナルは無事に起動しました!そして Vim/src ディレクトリに移動し、下記を実行して Vim をビルドします。

mingw32-make.exe -f Make_ming.mak

今までの努力が報われて、ビルドができることを確認しました。

〜・〜・〜・〜・〜・〜

ここで満足していれば良いものの、「一年以上も前のパッケージなのに update-core で何もないのはおかしいやろ!」という気持がムクムクと育ってしまい、もう少し調べてみました。そしてここに書いてある pacman -Syy を採用することにしました。とりあえず(この「とりあえず」が危険言うてるのに……)実行します。

:: Synchronizing package databases...
 mingw32                  307.4 KiB   288K/s 00:01 [#####################] 100%
 mingw32.sig               96.0   B  0.00B/s 00:00 [#####################] 100%
 msys                     142.4 KiB   284K/s 00:01 [#####################] 100%
 msys.sig                  96.0   B  0.00B/s 00:00 [#####################] 100%

そして再び update-core をすると、下記のようにアップデートすることができました!(でもまたデータ通信してる……)

==> Update package databases...
:: Synchronizing package databases...
 mingw32 is up to date
 msys is up to date
==> Checking if there are critical packages to upgrade.
bash 4.3.042-1 -> 4.3.046-1
pacman 4.2.1.6198.439d376-1 -> 5.0.1-1
msys2-runtime 2.2.1.16655.6ecd782-2 -> 2.6.0-1
==> WARNING: You MUST restart MSYS2 to finish core packages update!!!
==> Update core packages...
resolving dependencies...
looking for conflicting packages...

Packages (4) bash-4.3.046-1  msys2-runtime-2.6.0-1  msys2-runtime-devel-2.6.0-1
             pacman-5.0.1-1

Total Download Size:   16.90 MiB
Total Installed Size:  73.64 MiB
Net Upgrade Size:      29.31 MiB

:: Proceed with installation? [Y/n]
:: Retrieving packages ...
 msys2-runtime-2.6.0...     2.2 MiB   180K/s 00:12 [#####################] 100%
 bash-4.3.046-1-i686     1878.4 KiB   263K/s 00:07 [#####################] 100%
 pacman-5.0.1-1-i686        9.5 MiB   234K/s 00:41 [#####################] 100%
 msys2-runtime-devel...     3.5 MiB   185K/s 00:19 [#####################] 100%
(4/4) checking keys in keyring                     [#####################] 100%
(4/4) checking package integrity                   [#####################] 100%
(4/4) loading package files                        [#####################] 100%
(4/4) checking for file conflicts                  [#####################] 100%
(4/4) checking available disk space                [#####################] 100%
(1/4) upgrading msys2-runtime                      [#####################] 100%
(2/4) upgrading bash                               [#####################] 100%
(3/4) upgrading pacman                             [#####################] 100%
(4/4) installing msys2-runtime-devel               [#####################] 100%

ここで exit で終了するのではなく、[X] を押して終了し、再度起動するのが良いのですよね?ポチっ。

うわ、また「プロシージャ エントリ ポイント CancelSynchronousIo がダイナミック リンク ライブラリ KERNEL32.dll から見つかりませんでした。」というエラーが……。もうなんなん?(>_<)

こういうこともあろうかと、バックアップしていた msys32 ディレクトリを復帰させて、その中の var/cache/pacman/pkg に先程ダウンロードしてキャッシュされていたアーカイブをコピーしました。そしてこの状態で

pacman -S mingw-w64-i686-toolchain

を実行します。すると、ネットワークから再度ダウンロードせずに、こちらのキャッシュされている方からインストールしてくれるのです!データ容量助かった。

あとは最低限使いそうなものをインストールして、ちょこっと作業をしてこの記事を終えたいと思います。バージョンは古いけれども十分です。

pacman -S git で (26.2MiB) Ver 2.5.2 が
pacman -S ruby で (4.0MiB) Ver 2.1.5p273 が
pacman -S python3 で (12.16MiB) Ver 3.4.3 が
pacman -S sqlite3 で (0.03MiB) Ver 3.8.8.3 が

git が入りましたので Vim を最新版にしてビルドです。これで古い ThinkPad Z60t (Windows XP) が甦りました!

f:id:nakinor:20170106230005j:plain

ちなみに iBook Late 2001 (Panther) でも最新の Vim が動いています。

f:id:nakinor:20170106230020j:plain

満足しましたので両方ともダンボールに放り込んで押し入れへ。

教訓

もう、pacman -Syupacman -Syyupdate-core も、二度としないッ!