!!!GCCのspecsとは GCCには、GCC-3系まで、''specs''というファイルがあった。これは、GCCのデフォルトの動作を決定するファイルで、かなり重要なものだ。例えば標準のシステムインクルードパス、例えばデフォルトでリンクされるライブラリ(glibcやMinGWで言えばlibmsvcrt)等が記述されており、''hello-worldを書く時にさえ必要''ということになる。 このファイルはMinGWならば/lib/gcc/mingw32//にあり、編集することで''GCCのデフォルトの挙動を変更することが可能''だ。MinGWはMSYS上から使用する限りは特に問題なくとも、コマンドプロンプトなどから直接MinGWを使用する場合にはこのファイルを修正し、標準のシステムインクルードパスを記述しなければ、まともに使用できないこともある。 !!そもそものgccの仕組み GCCを利用するため、普段何気なくgccと打ち込んではいるが、例えばMinGWのgcc-3.4.5ではgcc.exeが88KBしかない。''誰がどう考えても、gcc.exeが全て処理しているとは思えない''。 正解は、/libexec/gcc/mingw32//以下にcc1.exeという''3MBを超える''実行ファイルが存在し、こちらがgccコンパイラ本体となっている。ではなぜそんなややこしいことをするのか。それは、''gccが多機能すぎる''ことから、''処理を分散させるため''である。 gccは、そのコマンドだけで、プリプロセッサからアセンブラ、コンパイラ、リンカの役目まで果たしている。これを全て1つの.exeが賄うのは、不可能では無いにしても、管理上好ましくない。実際にはgccはリンカにld.exeを使用するし、コンパイラにはcc1.exeを使用する。 gcc.exeはフロントエンドでしかなく、実際に動作すべきプログラムはgcc.exeが判断して振り分けている。 !!specs その際の振り分け規則や、内部的にデフォルトで使用するオプションなどを記述するのが''specsファイル''、というわけだ。specsファイル相当のものは実はGCCをビルドする際に''GCCのバイナリにも埋め込まれている''が、この設定を''オーバーライド''するのがspecsファイルになる。ビルド環境と実行環境が異なっても、これにより差異を吸収することができる。 gcc.exeによって使用されているspecsの内容は、 gcc -dumpspecs で表示される。実際にspecsを編集する場合には、この内容をリダイレクトし、上記ディレクトリに置いて編集するのがよい。 !!specsファイルの記述方法 specsの中身は、かなりごちゃごちゃとした表記になっていると思う。基本的なルールとしてはMakefileの書式に近く、 <対象>: <実行するコマンド> の形式になっている。が、その内容は殆どが%{}, %()等のマクロや変数展開であり、初めて見た人間にはBrainfuckやWhitespaceのような変態言語の一種のようにも見える。例えば以下のTDM版gcc-4.4.0のdumpspecsを見てみて欲しい。 *cpp_unique_options: %{C|CC:%{!E:%eGCC does not support -C or -CC without -E}} %{!Q:-quiet} %{nostdin c*} %{C} %{CC} %{v} %{I*&F*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{! MM:%{!MT:%{!MQ:%{MD|MMD:%{o*:-MQ %*}}}}}}} %{remap} %{g3|ggdb3|gstabs3|gcoff3|gx coff3|gvms3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{fmudflap:-D_MUDFLAP -include mf-runtime.h} %{fmudflapth:-D_MUDFLAP -D_MUDFLAPTH -include mf-runtime.h} %{E|M| MM:%W{o*}} 最初のエラー的メッセージと最後のマクロ定義等のあたりは分からないでもないが、なんとなーく、気分的には、変態言語のFalseに近いようにも感じる。 !!実用・specsファイル 正直上記の内容を解説する気にはなれないので、ここでは簡単な実用例を示す。MinGWをC:\msys\mingw-3にインストールしているとする。 !システムインクルードパスの追加 もっともよく使う例。specsファイル中で *cpp: %{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} という箇所を探し出し、プリプロセッサオプションの-Iを加えればよい。 *cpp: %{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} -I C:/msys/mingw-3/include この際、Windows上での絶対パス表記にしているのがポイントだ。MinGWは元々MSYSに依存しないので、MSYS依存のパス表記は使わない方がよい。 !システムライブラリパスの追加 specsファイル中で *link_libgcc: %D という箇所を探し出し、リンカオプションの-Lを加えればよい。 *link_libgcc: %D -L C:/msys/mingw-3/lib !その他 もう少し凝った解説は、英文だがMinGWのサイトに[HOWTO Use the GCC specs file|http://www.mingw.org/node/25]という記事がある。また、当然だが[GCCのオンラインマニュアル|http://gcc.gnu.org/onlinedocs/]にも[Specifying subprocesses and the switches to pass to them|http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Spec-Files.html]という解説がある。 !!GCC4でのspecs この記事の冒頭では何気なく、「GCC-3系まで」と書いた。実は、GCC-4系ではspecsファイルは標準で含まれない。細かな意図などは調査していないが、とにかく''GCC-4系ではspecsファイルは通常、不要になった''。ただし、特別な目的があるなら、ただ書いて置けば使用されるようになっている。よって、[GCC-4.4.0のマニュアルにもspecsファイルの解説|http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Spec-Files.html]は存在する。