pacman -Syu でハマる
サポート終了からそろそろ 3 年になる Windows XP。「えっ!もうそんなんなるぅ?」と驚いてしまう程に時が経つのは早いのですが、今でも私は使っています。今回は MSYS MinGW について、ちょっとした顛末を記事にします。
私はパソコンにあまり詳しくないのですが、過去に次の記事で MSYS MinGW について取り上げました。
2013 年の時とくらべて MSYS2 になった 2015 年の方が、格段とインストールがしやすくなりました。pacman の存在が大きいのだと思います。gem
や pip
と同じように手軽に使えるので、ついつい無駄に 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) が甦りました!
ちなみに iBook Late 2001 (Panther) でも最新の Vim が動いています。
満足しましたので両方ともダンボールに放り込んで押し入れへ。
教訓
もう、pacman -Syu
も pacman -Syy
も update-core
も、二度としないッ!