pgpdump のビルドのついでに MinGW-w64 を導入してみる
昨年の時点で pgpdump が 0.28 にアップデートされていた。 といっても今回は細かい修正のみ。 次のアップデートはおそらく SHA-3 の議論が OpenPGP や GnuPG で本格化してからとなるだろう。
でも,これに気づいたのが今年も4月に入ってから。 昨年・今年といろいろあったとはいえ,ダメ過ぎる,私 orz
で,自宅マシンは既に64bit機に変わってるし,どうせなら git で管理しようと思い始めてゴソゴソ作業しだしたのが今月に入ってから。 で,いろいろ見てたら MinGW って64bit版があるのね。 こりゃあ入れずんばなるまい,と作業を始めたら泥沼にはまってしまった。 まぁよくある話(笑)
というわけで,その時の作業を覚え書きの形でかいつまんで。
準備
今回の目標は以下のとおり。
- MinGW のビルド環境を32bit版と64bit版の両方を並列に構築する
- その上で pgpdump がビルドできるか確認する
- ついでに 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 が最強なので,是非入れてほしい。
そうそう。 今回参考にしたのは以下のページ。 ありがとうございます。
- Setting up a MinGW-w64 build environment - ASCEND
- MinGW (64bit) + MSYS 環境の構築 (1) | DeVlog - 銀の翼で翔べ -
- MinGW (64bit) + MSYS 環境の構築 (2) | DeVlog - 銀の翼で翔べ -
mingw-get のインストール
mingw-get は MinGW のサイトからダウンロードする。
- MinGW | Minimalist GNU for Windows
- Getting Started | MinGW (このページは最初に読むべき。私でも読める程度の英語なので大丈夫)
- Download
ダウンロードページにある 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 にツッコミ入れちゃったよ。 まぁこの辺はこれから解消されるのかもしれない。
継続調査項目
まぁとりあえずビルドは通ったわけだが,ちょっとアレな感じが拭えないので,以下を継続して調べてみることにする。
- TDM-GCC についても調べる
- パッケージ管理ツール yypkg-1.4.0.exe について調べる(でもこいつ MSYS を汚すんだよなぁ)
- mintty について調べる(参考: MinGW の mintty で対話モード、ついでに vim 設定 | ユニマージュ)
- MinGW クロス環境
まぁでも, MinGW であまりゴリゴリやる気はない。 MinGW の真価は Linux 等で Windows のクロス環境が使える! ことに限る。 Windows 上の動作はあくまでオマケなのだ。 UNIX 系の環境が(Windows 上で)欲しければ仮想環境を組むか Cygwin を使うほうが合理的だからだ。 まぁでも Free (自由)な環境を確保しておくことも大事なので。
次回があるかどうかは分からない。
6/22 追記: