トップ 検索 一覧 ヘルプ RSS ログイン

GCCのspecsとはの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!GCCのspecsとは

GCCには、GCC-3系まで、''specs''というファイルがあった。これは、GCCのデフォルトの動作を決定するファイルで、かなり重要なものだ。例えば標準のシステムインクルードパス、例えばデフォルトでリンクされるライブラリ(glibcやMinGWで言えばlibmsvcrt)等が記述されており、''hello-worldを書く時にさえ必要''ということになる。

このファイルはMinGWならば<mingw>/lib/gcc/mingw32/<gcc-ver>/にあり、編集することで''GCCのデフォルトの挙動を変更することが可能''だ。MinGWはMSYS上から使用する限りは特に問題なくとも、コマンドプロンプトなどから直接MinGWを使用する場合にはこのファイルを修正し、標準のシステムインクルードパスを記述しなければ、まともに使用できないこともある。

!!そもそものgccの仕組み

GCCを利用するため、普段何気なくgccと打ち込んではいるが、例えばMinGWのgcc-3.4.5ではgcc.exeが88KBしかない。''誰がどう考えても、gcc.exeが全て処理しているとは思えない''。

正解は、<mingw>/libexec/gcc/mingw32/<gcc-ver>/以下にcc1.exeという''3MBを超える''実行ファイルが存在し、こちらがgccコンパイラ本体となっている。ではなぜそんなややこしいことをするのか。それは、''gccが多機能すぎる''ことから、''処理を分散させるため''である。

gccは、そのコマンドだけで、プリプロセッサからアセンブラ、コンパイラ、リンカの役目まで果たしている。これを全て1つの.exeが賄うのは、不可能では無いにしても、管理上好ましくない。実際にはgccはリンカにld.exeを使用するし、コンパイラにはcc1.exeを使用する。

gcc.exeはフロントエンドでしかなく、実際に動作すべきプログラムはgcc.exeが判断して振り分けている。

!!specs

その際の振り分け規則や、内部的にデフォルトで使用するオプションなどを記述するのが''specsファイル''、というわけだ。specsファイル相当のものは実はGCCをビルドする際にも''GCCのバイナリにも埋め込まれている''が、この設定を''オーバーライド''するのが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 z:/libx/lib
 %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系まで」と書いた。実は、GCC4系ではspecsファイルは標準で含まれない。具体的に何処をどうしたのかまで調査していないが、とにかく''GCC4系ではspecsファイルは通常、不要になった''。ただし、特定の目的があってspecsファイルを使用することはできるようになっている。よって、[GCC-4.4.0のマニュアルにもspecsファイルの解説|http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Spec-Files.html]は存在する。
この記事の冒頭では何気なく、「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]は存在する。