GNAT開発環境について〜gcc付属ツール

2012年12月時点でのgccまたはGNAT GPLをインストールした際に付属する「公式」ツール群の紹介を行う。
多岐に渡るので、一つ一つの詳しい説明は行わない。
各ツールの細かい情報はそれぞれのドキュメントを参照して欲しい。

もし知らないツール名があったらちょっと読んでみて欲しい。
もしかしたらあなたの問題を解決するツールがあるかもしれないから。

★は重要度。五点満点。

なおこの記事は某所のパクリです。あとAda Advent Calendarとは何の関係もありません。

gcc ★★★★★

コンパイラ。説明不要。
Adaという言語のポテンシャルを全く引き出していない上にバグの多い糞コンパイラですが、現状Ada2012が使えるフリーのAdaコンパイラはこれしかないので仕方がないです。
(別に私一人が言ってるわけでもなく、comp.lang.adaでAda, the best language with the not-so-best tool chainというスレが賑わっているぐらい)

gnat ★

gnat makeという風に実行すればgnatmakeを呼び出す、みたいな、svnやgitのサブコマンド風味ラッパー。
イマイチ何のためにあるのか良くわからないツール。

gnatbind ★★★★★

main関数生成ツール。
Adaでは、引数なしのグローバル関数をエントリポイントとして扱うことになっています。
これは当然libc等が要求するC形式のmain関数とは異なりますので、(freestandingでもしない限り普通は)mainを生成してやる必要があります。

gnatchop ★★

複数の翻訳単位がひとつのファイルにまとまっているものを、切り分けてくれるツール。
GNAT以外のコンパイラには、specとbodyを同じファイルに書けるものもあり、そういうソースをGNATでコンパイルしたい時に使います。具体的にはACATSのテストケース。

gnatclean ★

ビルド過程でできたファイルを消してくれるツール。どう考えてもrmのほうが短い。

gnatfind ★★★

指定したソースコード上の位置で使っているシンボルの定義を探しだしてくれるツール。
超簡単に言うとocamlspotのAda版。

gnatkr ★★★★

Adaのソースファイル名は、普通はpackage名をフルで使うのですが、GNATランタイムではMS-DOSの8.3形式に合わせてファイル名が縮められております。
このファイル名短縮を行なってくれるツール。

gnatlink ★★★★★

gnatbindで生成したmainを起点に、依存ファイル全てをかき集めてldに渡してくれるツール。

gnatls ★★

ファイル間の依存関係を一覧するツール、らしい。使った事無いです。

gnatname ★

package名と無関係なファイル名が使われている時に、対応付けを行うツール、らしい。使った事無いです。

gnatmake ★★★★★

依存関係の解析、必要なファイルの再コンパイル、gnatbind、gnatlinkを全部自動で行なってくれるビルドツール。
モジュールがある言語なら当然です。Cとは違うのですよ、Cとは。
よほど細かいことをしない限りは、大抵これだけでOK。
一応、拡張子.gprのファイルに詳細なビルドルールを書くこともできます。GNAT GPL付属のgprbuildは上位互換のツール群。

gnatprep ★★

Ada用のプリプロセッサ。別段、Adaの規格にはプリプロセッサなんて無いですし、gnatprepの機能的にもcppと比べるべくもなく貧弱です。
ACATSでプラットフォームに合わせて置換しろと書かれているキーワードの書式と同じ構文っぽいから多分それ用、っていうかそれ専用。

gnatxref ★★★

クロスリファレンスを出力するツール。

以下ASIS。

asistant ★

ASISの対話環境。構文木をダンプしたりできます。
asistant自体の構文がめんどかったりして、積極的にASISアプリを開発しようという超奇特な人でもない限り使わないかと。

gnatcheck ★

コーディング規約を守っているかどうかチェックしてくれるツール、らしい。使いたくもないです。

gnatelim ★

ソースコード上から使われていない関数を抽出して、出力に含めないようにするpragmaを吐いてくれます。
擬似的にスマートリンクを実現するためのもの。
ちょっとややこしいことをしているソースコードを食わせるとすぐ内部エラーで落ちる上に、gcc自体に-ffunction-sectionsと-fdata-sectionsを渡してld --gc-sections(Macは-dead_strip)したほうが何倍も手っ取り早いです。

gnatmetric ★

行数とか型の数とかいろいろ数えてくれます。
関数の数がどうたらこうたら複雑度がどうたらこうたら上司に言われてイヤイヤ管理しないといけない企業では役に立つんでしょう。Adaの仕事なんて全く無いので、結果として使う機会は一生無いよ!やったね!

gnatpp ★★★

ソースコードフォーマッタ。珍しくかなり優れたツールです。
ただ、タブを全部スペースに展開してくれますので、タブでインデントする派の私はあまり使ってません。

gnatstub ★★

specだけ書いてこれに渡すとbodyの雛形を作ってくれます。
それなりに便利。bodyファイル書き始める前に存在を思い出すことができたらの話ですが……いつも思い出す頃には手遅れなんですよねコンチキショウ。

以下外部ツール

binutils ★★★★★

GNUのリンカやアセンブラ等。
わざわざ入れ直さなくてもプラットフォームに既にあるもので充分なのですが、GNAT GPL版は、libaddr2line.aというものが付いてきて、バックトレースを単なるアドレスの数値だけではなく具体的なソースコード上の位置で表示できるようになります。

gdb ★★★★

デバッガ。
わざわざ入れ直さなくても(何年も前のバージョンのままとかでなければ)プラットフォームに既にあるもので充分です。
gdbそのものはAdaモードに対応しているのですが、GUIフロントエンドはAdaを考慮してくれないものが多くて、素のgdbを使うはめに。例えばxcodeEclipseなんかでもステップ実行はできるのですが、式評価みたいな機能はgdbはAdaのつもり、xcodeEclipseはCのつもりで動いてくれますのでわけわからんエラーが出ると思います。
統合環境組み込みのGUIフロントエンドではなく、cgdbやInsightみたいな、単にgdbを見易くしただけみたいなものであればほぼ問題なく使えます。

DragonEgg ★

gccプラグインgccの中間木をllvmに渡すもの、らしい。どなたか試した人います?