【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

MSYSのPOSIX互換レイヤをビルド

前回、MSYSのPOSIX互換レイヤをバイナリインストールして利用する方法を取り上げました。

今回はソースからビルドする方法です。互換レイヤを利用するだけならビルドは不要ですが、ソースを調べたり改造したりするなら必要です。

まずソースをダウンロードします。

アーカイブの中身は単一ディレクトリにまとめられていません。ファイルが散らからないようにディレクトリを作ってから展開します。

$ mkdir msys-build
$ cd msys-build
$ tar xvf msysCORE-1.0.17-1-msys-1.0.17-src.tar.lzma

展開して出てきた msysCORE.RELEASE_NOTES.txt にビルド方法が説明されています。そのドキュメントに必要な情報はすべて書いてありますが、作業過程と補足的な情報を書きます。

ドキュメントにはビルドに必要なパッケージが列挙されていますが、以下のコマンドで不足分を自動的にインストールできます。

$ ./msysrlsbld -e build_dep

※ スクリプト名は MSYS ReLeaSe BuiLD に由来するようです。

ドキュメントにはオプション付きでMSYSを起動するよう指示があります。オプションで何が変わるのかを追ってみると、バッチファイルで環境変数MSYSTEM=MSYSをセットして、/etc/profileでパスの順序を入れ替えます。それを手動で行えば以下の通りです。

$ export MSYSTEM=MSYS
$ export PATH=/bin:$PATH

パスをいじっているのはgccを切り替えるためです。MSYSのPOSIX互換レイヤはgcc-3.4.4でのビルドが推奨されています。先ほどビルドに必要なコマンドを追加インストールしましたが、その中にはgcc-3.4.4(/bin/gcc)が含まれます。通常のMSYSでは/mingw/bin/gccを使用しますが、パスの優先順位を入れ替えることで/bin/gccを使用するよう切り替えるわけです。

試しにgccを切り替えずに4.6.2のままビルドを行ったところ、source/newlib/libc/ctype/ctype_.cのコンパイルでalias属性がエラーになりました。対処方法は不明のため、素直に3.4.4を使った方が良さそうです。

後はビルドスクリプトを実行するだけです。環境変数MSYSTEM=MSYSでなければ(デフォルトはMINGW32)、ビルドがスキップされエラーになります。

$ ./msysrlsbld

ビルドが完了すれば自動的に配布物がアーカイブされます。

msysCORE-(略)-bin.tar.lzma ランタイム
msysCORE-(略)-dbg.tar.lzma デバッグ情報付きランタイム
msysCORE-(略)-dev.tar.lzma ヘッダ・CRT・インポートライブラリなど
msysCORE-(略)-doc.tar.lzma ドキュメント
msysCORE-(略)-ext.tar.lzma コマンドなど
msysCORE-(略)-lic.tar.lzma ライセンスのドキュメント

以上で互換レイヤのビルドは完了です。コマンドはMSYS特有のものしか含まれないため、shやlsなどのユーザーランドは別途ビルドすることになります。