pgpdump のビルドのついでに MinGW-w64 を導入してみる

no extension

昨年の時点で pgpdump が 0.28 にアップデートされていた。 といっても今回は細かい修正のみ。 次のアップデートはおそらく SHA-3 の議論が OpenPGP や GnuPG で本格化してからとなるだろう。

でも,これに気づいたのが今年も4月に入ってから。 昨年・今年といろいろあったとはいえ,ダメ過ぎる,私 orz

で,自宅マシンは既に64bit機に変わってるし,どうせなら git で管理しようと思い始めてゴソゴソ作業しだしたのが今月に入ってから。 で,いろいろ見てたら MinGW って64bit版があるのね。 こりゃあ入れずんばなるまい,と作業を始めたら泥沼にはまってしまった。 まぁよくある話(笑)

というわけで,その時の作業を覚え書きの形でかいつまんで。

準備

今回の目標は以下のとおり。

  1. MinGW のビルド環境を32bit版と64bit版の両方を並列に構築する
  2. その上で pgpdump がビルドできるか確認する
  3. ついでに Python 等の環境も MinGW 上で使えるようにする

このため今回のフォルダ構成はちょっと変則的に以下のようにした。

${MINGW}/32   : 32bit版 MinGW
${MINGW}/64   : 64bit版 MinGW
${MINGW}/msys : MSYS (32bit版のみ)

${MINGW} は MinGW のインストール先フォルダを指す(今回フォルダのデリミタ文字を “/” としてるけど適当に読み替えてね)。 既定では C:/MinGW になっているはず。 MSYS では UNIX 系の shell 環境を提供している。 残念ながら MSYS は32bit版しかない。

事前に入れる必要のあるツールは特に無し。 開発に必要なほかのツール(NSIS など)は後から入れても構わない。 後述するが, MSYS では fstab の書き換えで任意のフォルダをマウントできる。 強いて言うなら 7-Zip は入れておいたほうが良い(64bit版 MinGW は 7z 形式で書庫化されていることが多い)。 ていうか,少なくとも Windows では 7-Zip が最強なので,是非入れてほしい。

そうそう。 今回参考にしたのは以下のページ。 ありがとうございます。

mingw-get のインストール

mingw-get は MinGW のサイトからダウンロードする。

ダウンロードページにある mingw-get-setup.exe をダウンロードすればOK。

mingw-get は MinGW 用のパッケージ管理ソフトで apt-get の MinGW 版だと思っていただいて差し支えない。 残念ながら64bit版にはない。

インストールの際は若干の修正が必要。

まず mingw-get-setup.exe を起動すると以下の画面が現れる。

ポイントは “Installation Directory” の指定と “graphical user interface ” のチェックを外すこと。 GUI はまだ荒削りな感じで使い勝手が良くない。 普通のインストールでも要らないくらいだ(笑)

で, mingw-get のインストールが完了したら以下のフォルダにある profile.xml を探し内容を変更する。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<profile project="MinGW" application="mingw-get">
  <repository uri="http://prdownloads.sourceforge.net/mingw/%F.xml.lzma?download"/>
  <system-map id="default">
    <sysroot subsystem="mingw32" path="%R" />
    <sysroot subsystem="MSYS" path="%R/../msys" /> <!-- ここがオリジナルと違う -->
  </system-map>
</profile>

これで mingw-get で MSYS をインストールする準備が整った。

32bit版 MinGW / MSYS のインストール

ビルドを行うのに最低限必要なパッケージは以下のとおり。

  • msys-core
  • msys-base
  • msys-vim
  • msys-wget
  • msys-patch
  • msys-flex
  • msys-bison
  • msys-binutils
  • mingw32-base
  • mingw-developer-toolkit

これらを mingw-get を使ってまとめてインストールする。

> cd c:\mingw\32\bin
> mingw-get install msys-core msys-base msys-vim msys-wget msys-patch msys-flex msys-bison msys-binutils mingw32-base mingw-developer-toolkit

これで32bit版のインストールは完了。

fstab の編集

MSYS を起動する前に fstab を設定する。 ${MINGW}/msys/etc/fstab ファイルを作成し,以下のように記述する。

c:/mingw/32     /mingw

これで MSYS の shell 上では MinGW をインストールしたフォルダを /mingw にマウントできる。 他に入れたいものがあれば同様にマウントし,必要であればパスを通せば良い。 64bit版 MinGW も

c:/mingw/64     /mingw

とすれば良い。

ここまでくればみなさんピンとくるだろうが, fstab を切り替えれば32bitと64bitの環境を切り替えて使えるようになる。 MSYS の shell を起動するには ${MINGW}/msys/msys.bat を起動する。 したがって msys.bat に環境を切り替えるオプションを追加記述すればいいわけだ。

zlib および libbz2 のインストール

32bit版の MinGW のインストールは以上だが, pgpdump をビルドするには zlib および libbz2 も必要。 なので mingw-get でこれらも同様にインストールする。

> mingw-get install mingw32-bzip2 libz

実は libz は最初のインストールで標準で入れられているのだが,何故か gcc が認識してくれない。 上のコマンドを実行すると /mingw/include および /mingw/lib にファイルがセットされるのだが,実は既に /mingw/mingw32 に libz が入っていて, gcc は /mingw/mingw32/include を認識してくれないのだ。 しかもリンカの方は /mingw/mingw32/lib 内の libz.a や libz.dll.a を認識してくれやがる。 なんだかなぁ。

そうそう, MinGW においては *.a より *.dll.a が優先的にリンクされる。 依存する DLL があると何かと邪魔なので, *.dll.a はリネーム(または思い切って削除)した方がいい。 もちろん /mingw/mingw32/lib 内の *.dll.a もお忘れなく。

pgpdump のビルド(32bit版)

pgpdump のリポジトリは以下にある。

まぁビルドの確認をするだけなので作者のリポジトリから直接ローカルに clone してもいいのだが,ここは GitHub のお作法に則って,いったん私のスペースに fork して,それからローカルに clone した。 ビルド作業中にソースを変更するハメになると拙いので,念のため branch も切っておく(まぁ実は必要なかったのだが)。

で,MSYS のshell からローカルのフォルダに入って make する。

$ cd /proj/pgpdump/pgpdump
$ ./configure -prefix=/mingw
$ make
$ strip pgpdump.exe

make ではCコンパイラを gcc ではなく cc で呼ぼうとするが, MinGW では gcc と cc は同じものなので気にしなくてよい。 気になるようなら ~/.profile または /etc/profile に環境変数を設定するか

$ make CC=gcc

とすればよい。

ちなみに

$ make archive

とすると, git の archive コマンドを使ってパッケージングしてくれる。 なるほど, git のアーカイブコマンドってこうやって使うのか。

64bit版 MinGW のインストール

64bit版 MinGW は本家 MinGW から fork したプロジェクトだ。 で,今のところ大きく2つのプロジェクトがある。

どちらも専用のインストーラがあるので好きな方を使えばいいのだが,今回は MinGW-w64 を使用することにした。 MinGW-w64 の場合,例外ハンドリングに SEH (Structured Exception Handling)が使えるというメリットがある。

MinGW-w64 のインストーラはダウンロードページの “Mingw-builds project - native toolchains using trunk” から取得できる。

64bit版にも libbz2 がない。 ないので,ソースを取ってきてビルドするしかない。

このソースコードは MinGW に対応していないが,以下のページを参考に bzlib.h を修正すれば良い。

pgpdump のビルド(64bit版)

64bit版もやり方はは同じ。 問題なし。

MinGW-w64 のパス設定

32bit版も微妙におかしかったが MinGW-w64 は更におかしい。

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=C://mingw/64/mingw64/bin/../libexec/gcc/x86_64-w64-mingw3
2/4.9.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-4.9.0/configure --host=x86_64-w64-mingw32 --bu
ild=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysr
oot=/home/nixman/mingw-gcc-4.9.0/x86_64-490-posix-seh-rt_v3-rev2/mingw64 --with-
gxx-include-dir=/mingw64/x86_64-w64-mingw32/include/c++ --enable-shared --enable
-static --disable-multilib --enable-languages=ada,c,c++,fortran,objc,obj-c++,lto
 --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-li
batomic --enable-libitm --enable-lto --enable-graphite --enable-checking=release
 --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-
isl-version-check --disable-cloog-version-check --disable-libstdcxx-pch --disabl
e-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --
disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --wit
h-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/h
ome/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/
home/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-w64-mingw32-static --with-mpc=/
home/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-w64-mingw32-static --with-isl=/
home/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-w64-mingw32-static --with-cloog
=/home/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-w64-mingw32-static --enable-c
loog-backend=isl --with-pkgversion='x86_64-posix-seh-rev2, Built by MinGW-W64 pr
oject' --with-bugurl=http://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe
 -I/home/nixman/mingw-gcc-4.9.0/x86_64-490-posix-seh-rt_v3-rev2/mingw64/opt/incl
ude -I/home/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-zlib-static/include -I/h
ome/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-w64-mingw32-static/include' CXXF
LAGS='-O2 -pipe -I/home/nixman/mingw-gcc-4.9.0/x86_64-490-posix-seh-rt_v3-rev2/m
ingw64/opt/include -I/home/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-zlib-stat
ic/include -I/home/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-w64-mingw32-stati
c/include' CPPFLAGS= LDFLAGS='-pipe -L/home/nixman/mingw-gcc-4.9.0/x86_64-490-po
six-seh-rt_v3-rev2/mingw64/opt/lib -L/home/nixman/mingw-gcc-4.9.0/prerequisites/
x86_64-zlib-static/lib -L/home/nixman/mingw-gcc-4.9.0/prerequisites/x86_64-w64-m
ingw32-static/lib'
Thread model: posix
gcc version 4.9.0 (x86_64-posix-seh-rev2, Built by MinGW-W64 project)

「誰やねん! nixman」って gcc にツッコミ入れちゃったよ。 まぁこの辺はこれから解消されるのかもしれない。

継続調査項目

まぁとりあえずビルドは通ったわけだが,ちょっとアレな感じが拭えないので,以下を継続して調べてみることにする。

  1. TDM-GCC についても調べる
  2. パッケージ管理ツール yypkg-1.4.0.exe について調べる(でもこいつ MSYS を汚すんだよなぁ)
  3. mintty について調べる(参考: MinGW の mintty で対話モード、ついでに vim 設定 | ユニマージュ
  4. MinGW クロス環境

まぁでも, MinGW であまりゴリゴリやる気はない。 MinGW の真価は Linux 等で Windows のクロス環境が使える! ことに限る。 Windows 上の動作はあくまでオマケなのだ。 UNIX 系の環境が(Windows 上で)欲しければ仮想環境を組むか Cygwin を使うほうが合理的だからだ。 まぁでも Free (自由)な環境を確保しておくことも大事なので。

次回があるかどうかは分からない。

6/22 追記:

バイナリをいつものところにおいてある