!!!今更MinGW 2009.06(1) felidlabo_pack_toolkit 猫科研究所では2008年春版の執筆後、普段は中々更新しないMinGWが更新したため、変更点を記述するのが面倒になって[[MinGW猫科研究所パック]]を作成した。その後、ffmpegやx264等のビルドターゲットの状況変化に応じてこのパックを更新してきたが、今度はその更新の手間が負担になってきた。 そこでa003を作成する際、必要なファイルの情報を記述するだけで''自動的に猫研パックを作成するツールキット''を作成した。これが''猫科研究所パックツールキット''である。 今回の今更MinGW/MSYS 2009.06は、このツールキットがバッチファイルを叩くだけで行う動作の解説に過ぎない。つまり、ツールキットに含まれるバッチファイルやWSH(JScript)、シェルスクリプトが理解できれば、特に''この記事を読む必要はない''。 !!ツールキットの方針 ツールキットを作成するに当たって、2つの目標を立てた。1つは、''ツールキット自体にはなるべくバイナリを含まないこと''で、もう1つは''なるべく猫科研究所の自作とすること''だ。 これは一定のレベルで達成されている。まず、ツールキットに初期状態で必要なバイナリは[7-zip|http://www.7-zip.org/]だけとなった。そして外部由来のファイルは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.bat 04_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 バッチファイル間で共通で使用する変数をまとめたバッチファイル。直接使用することはない。