トップ 検索 一覧 差分 ソース ヘルプ RSS ログイン

今更MinGW 2009.06(1) felidlabo_pack_toolkit

今更MinGW 2009.06(1) felidlabo_pack_toolkit

猫科研究所では2008年春版の執筆後、普段は中々更新しないMinGWが更新したため、変更点を記述するのが面倒になってMinGW猫科研究所パックを作成した。その後、ffmpegやx264等のビルドターゲットの状況変化に応じてこのパックを更新してきたが、今度はその更新の手間が負担になってきた。

そこでa003を作成する際、必要なファイルの情報を記述するだけで自動的に猫研パックを作成するツールキットを作成した。これが猫科研究所パックツールキットである。

今回の今更MinGW/MSYS 2009.06は、このツールキットがバッチファイルを叩くだけで行う動作の解説に過ぎない。つまり、ツールキットに含まれるバッチファイルやWSH(JScript)、シェルスクリプトが理解できれば、特にこの記事を読む必要はない

 ツールキットの方針

ツールキットを作成するに当たって、2つの目標を立てた。1つは、ツールキット自体にはなるべくバイナリを含まないことで、もう1つはなるべく猫科研究所の自作とすることだ。

これは一定のレベルで達成されている。まず、ツールキットに初期状態で必要なバイナリは7-zipだけとなった。そして外部由来のファイルは7-zip以外には、MSYSのアイコンと起動バッチファイル、そして大幅に変更したインストール後の調整スクリプトだけとなった。WSHを活用することで7-zipをもツールキットから排除することは不可能では無かったが、その場合Windowsの圧縮フォルダ機能(zipfldr.dll)が解除されていないことが前提となるため、これは見送った。

 ツールキットが行うこと

ツールキットは/_felidlabo以下の00_prepare.bat〜06_cleanup.batというバッチファイルを順番に叩くだけで猫研パックが作成できるようになっている。以下に各バッチファイルの説明を記載する。なお、猫研パックの/_felidlabo/readme.txtに同様の記述をしているため、そちらを読んで戴いても構わない。また、ツールキットには興味の無い方も、以下は飛ばして戴いて構わない

00_prepare.bat

猫研パックにはhttp経由でファイルを取得するWSHスクリプト(JScript)製のwgetmodoki.wsfが含まれている。これは猫研パックで作成したスクリプトで、WinHttpをActiveX経由で利用し、OSの機能のみでダウンロードが可能となっている。実際にはflhttp.wscがWinHttpのラッパであり、スクリプトコンポーネント形式にして再利用性を確保し、wgetmodoki.wsfがインターフェースとファイル操作を行っている。

00_prepare.batはこれらを利用し、より汎用的なダウンロードツールであるwget.exeとその依存DLLをGnuWin32から取得する。wgetmodokiがダウンロードツールであるにも関わらずwgetを取得し直すのは、wgetmodokiはhttpにしか対応しないことと、進捗状況の表示などより細かな動作がwgetmodokiでは不可能であることによる。ftpに関してはシェルを経由して扱えないこともないのだが、完了/失敗を検出する安定的手段が存在しないため、より安全にダウンロードするためwget.exeを最初に取得する。

これはツールキットの環境を整えるための準備で、完成するMinGW環境には影響しない。wget.exeを別の手段で得て/_felidlabo/bin以下に配置してもよい。ただし、wget.exeは--max-redirectをサポートしている必要がある。MinGWの公式配布である1.9.1は不可である。

01_download.bat

MinGW/MSYS, 追加ライブラリのダウンロードをwget.exeを使用して行う。ダウンロードされたファイルは/_felidlabo/dl以下に置かれる。ダウンロード対象ファイルのURLに関しては、/_felidlabo/listにある.txtに記述する。このファイルは1行が1つのファイルに対応しており、スペース区切りでURL、ファイル名、展開先パスを記述する。

例えば

http://up-cat.net/foo-felidlabo-1.7z foo-felidlabo-1.7z /bin

と記述した場合、これはup-cat.net/foo-felidlabo-1.7zにアクセスしてファイルを取得し、foo-felidlabo-1.7zというファイルが保存されることを確認し、そのファイルは次の02_extract.batで/binに展開されるべきであることを示している。

URLとファイル名を別に書いているのは、将来的にURLの末尾からファイル名を得られないアーカイブに対応するためである。例えば

http://up-cat.net/download.cgi foo-felidlabo-1.7z /bin

といったURL・ファイル名に対応が可能である。

wget.exeはURLリストの読み込みにも対応しているが、リストに複数の意味を持たせたため、バッチファイル側で1行ずつFOR文で回している。なお、sourceforgeは存在しないファイルを要求された場合に"404 Not Found"を返さず、インデックスページにリダイレクトし、最終的に"200 OK"を返すため、wgetの引数に"--max-redirect 0"が必要となる。

02_extract.bat

ダウンロードされたファイルを/_felidlabo/list以下のリストに基づきアーカイブを各ディレクトリに展開する。

この時の展開は7za.exeが行うが、7za.exeはtar.gzやtar.bzを与えるとgunzipのみ行い、tarを展開してくれない。このため2回展開する必要があり、FOR文の中でこの処理を行わせるのは厳しいため、1つのアーカイブを展開するバッチファイルとしてbin/extract.batを切り出した。

ところが、バッチファイルで扱えるファイル名操作では、.patch.gzのように1度の展開でよいものを区別する方法が見つからない。仕方なく、ファイル名の判断はさらにchknest.wsfに委譲している。2回目の展開エラーを無視すればchknest.wsfを使用せずとも動作は可能だが、色々不都合なのでここはWSHに頼った。

03_postinstall.bat

03_postinstall.batはバッチファイルの体裁だけで、/_felidlabo/bin/pi.shが本体である。

これはオリジナルのMSYSのpostinstallを改造したもので、猫研パックでは不要な処理をコメントアウトし、逆に必要な処理を追加している。

  • 元々の処理で残しているもの
    • 重複するコマンドの調整
  • 追加した処理
    • 猫研パックのための環境変数を/etc/flenvに出力
    • gccの.7zへの再パック処理
    • coreutilsからpr.exeのみを/binにコピーする処理

猫研パックはここまでの実行が完了した状態で配布している。

04_gccinstall.bat04_gccinstall.batはバッチファイルの体裁だけで、/_felidlabo/bin/gccinstall.shが本体である。

postinstallによって一度/_felidlabo/gccに展開されたgccは、03_postinstall.batで同じディレクトリに.7zで再アーカイブされる。そのアーカイブから/mingwに展開する。

ユーザがgcc-3とgcc-4のどちらを使用したいかは不明であるため、猫研パックではこれ以降を未実行の状態で配布している。これにより、plusパックをどちらでビルドするかもユーザが選択することが可能になっている。

内情として、gccを展開しなければplusパックがビルドできないが、gccを展開してしまうと.7zのアーカイブと2重になり、容量の無駄になるというジレンマがある。plusパックのインストール先を別にして後から合成する方法も考えたが、今度はplusパック同士の依存関係からinclude/libのパスを調整しなければならず、さらにlibxml2は--prefixに依存して設定ファイルを作成するなど面倒極まりないので今回は諦めた。

当初の猫研パックのようにgccは両方展開済みで後から調整するとか、plusパックのインストール後にgccのファイルを抜けばいいのだが、簡便なのでこの方式にしている。

05_plus-build.bat

nasm, yasm, zlib, libjpeg, libpng等のplusパック(オプションパック)をビルドする。plusパックは猫研パックを単なるC/C++言語の練習に使用するようなユーザには必ずしも必要ではないが、ffmpegを初めとしたオープンソースソフトウェアをソースからビルドする際には高頻度で必要になるパッケージ群である。

ビルド手順・コマンドは千差万別であるため、これはもう各個撃破になる。/_felidlabo/bin以下にビルドスクリプトを個別に用意しており、これを/_felidlabo/bin/05_plus-build.shが順に叩いて回るようになっている。各パッケージのインストールが完了すると.doneファイルが作成され、05_plus-build.shは.doneファイルが存在するスクリプトは実行しないようにしている。これにより、途中でビルドに失敗するパッケージがあった場合にも、全てがやり直しにはならない。

06_cleanup.bat

05_plus-build.batまでが問題なく実施できた場合に、plusパックのソース、ダウンロードしたアーカイブ、wget.exeと依存ファイルを削除する。猫研パックが一度完成すれば、実運用上不要になるファイルを削除する。

98_cleanup_for_release.bat

猫研パックのリリース用クリーンアップバッチファイル。06_cleanup.batのうち、plusパックのソースは削除しない。03_postinstall.batまで実施した状態で不要なファイル群を削除することで、リリース用の構成にする。猫科研究所が使用するためにあり、ユーザの方が使うことは無いかと思う。

99_cleanup_all.bat

ツールキットの初期状態として必須ではないファイルを全て削除する。構築済みのMinGW/MSYS環境が削除されることになるので注意。ただし、ユーザの作成物が存在する可能性が高いhomeディレクトリは安全のため削除しないようになっている。

xx_env.bat

バッチファイル間で共通で使用する変数をまとめたバッチファイル。直接使用することはない。

最終更新時間:2009年06月22日 03時17分50秒