GCCのspecs

specsについては前に調べたと思うんだけど、調べたことが中途半端だったうえになんか今見たら全然わからなくなってたのでメモ。


specsというのは、gccの補助プログラム呼び出し時のルールを書いたファイルのことだ。
gccは実はCコンパイラではなくて、拡張子に応じて、各種言語のコンパイラを呼び出してるだけっていうのは有名な話かと思う。で、そこらへんで各コンパイラを呼び出すときのオプションのルールを書いてあるのがspecsというわけだ。
で、まあ、そういう話はまあ、ふーん、って、ところなんだけど、このspecsがまた無駄なくらい高機能になってたりするので、GCC作ってる人達は変人ばっかだなぁ…と、いうか、素晴らしいと思いました。


まず、手始めに、簡単なところで、

.yes:
	yes %b 

こんな感じ。意味は、'yes'っていう拡張子だったら、次の行を実行っていうところか。%bは入力ファイルの拡張子を取り除いたもの。
(行末の処理がおかしいのか、行末にスペースが必要のような気がする)


例えば、上のを、"yes.spec"として、

$ gcc -c -specs=yes.spec no.yes

ってすると、

no
no
no
no
...

こんな感じで。(ただ、入力ファイルが存在するかどうかのチェックはしてるようなので、touch no.yesとかをしておかないといけない。)
%の文字についてはgcc.info、もしくはgcc.cのソースなんかを参照。


で、別の言語のコンパイラを呼び出したりもできる。
例えば、

.my-c:
	@c

@cにすると、C言語コンパイラを呼び出す。@Javaとか@C++とかもできる。


んで、specで重要なのはオプションに対応する場合だ。%{hogehoge:naninani}とかってすると、-hogehogeとしたときに、次のプロセスにオプションnaninaniが渡される、というものだ。例えば、

.yes:
	echo %{good:イイヨー} 

なんてして、

$ gcc -c -specs=yes.spec -good a.yes

こーやると、

イイヨー

こんな感じ。で、%{!hogehoge:naninani}ってすると、-hogehogeがなかったときに、naninaniが渡される。

.yes:
	echo %{good:イイヨー}  %{!good:ダメダヨー} 

こーすると、

$ gcc -c -specs=yes.spec -good a.yes
イイヨー
$ gcc -c -specs=yes.spec a.yes
ダメダヨー

こんな感じ。


他にも色々機能あるんだけど、このぐらいわかるようになればspecsも読めるかと。ただ、ファイルとして出力されてるのはgcc -dumpspecsされて生成されたものなんだけど、このspecsは各言語の全てについて記述されているわけではないようなので、実際のgccの挙動を理解するにはgcc.cを読まないといけないかもしれない。


ていうわけで、gccドライバはただのspecs言語インタプリタであった、という話。