Mac OS XにおけるAda開発環境の構築とAdaコンパイラの種類について

最近のAdaプログラマーはMacを使うという統計(標本数2だが、驚くべきことにこれでも統計学的に有意な結果を得られるのである)が得られたので、OS XでいかにしてAdaをコンパイルするための手順とともに、いくつかあるAda環境の違いについてもメモしておく。資料を掘り起こして纏めただけなので、間違っているところがあったら指摘願いたい。

まず先に、Ada環境について書いておこう。とりあえずのところ、今回は無料で使える環境に限定する。有料のものであればObjectAdaなども含まれるのだが、実際に使用することは希だろう。

無料で使える「Adaコンパイラ」としては(Freeという単語を使うとややこしくなるので「無料」という言葉を使いたい)、GNATがある。これはGCCをバックエンドにもつAdaコンパイラだ。GCCをバックエンドに持つと言ってもAdaのソースコードをCに翻訳するわけではなくて、バイナリを直接生成してくれる。Adaコンパイラだけあって、フロントエンド部分はAdaで書かれている。

話がすこしややこしくなるのは、GNATにはいくつかの種類が存在することだ。つまり、FSFがGCCの一部として提供しているGNAT、AdaCoreが有償で提供するGNAT Pro、AdaCoreが(単体の)Adaコンパイラとして提供していたGNAT(pリリース)、AdaCoreが無料で提供しているGNAT ProのGPL版であるGNAT GPL、さらにGNAT Proのアカデミック版であるGNAT Academic Program(GAP)である。

このように色々と種類が存在するのはGNATの歴史に由来する。元々のGNATは国防総省がAda95 ISO標準のリファレンス実装を作るためにNew−Yor kUniversityと契約し、GCCをバックエンドにしたコンパイラとして作られたものだ。GCCは利用される側であって、当時のGANTはGCCの一部ではなかった。GNATのコンパイラはGPLで提供されていた(GCCを使っているので当然である)。

GNATが実用になると、ユーザー企業がサポートを求めるようになった。コンパイラがフリーなのはいいことだが、サポートなしでは商用利用は厳しかったらしい。そこで、GNATの開発者たちはAdaCoreを作り、サポートと開発を行うようになった。フリーソフトウェア界隈にはよくある、ソフトウェア自体はGPLで無料だが、サポートは有料という方式だ。

こうして有料サポート付きで開発されるようになったのが「GNAT Pro」と呼ばれる一連のシリーズである。これは、コンパイラ自体はGPLであるが、標準ライブラリ(Ada.Text_IOとかそこらへんだ)はGNAT-Modified GPLで提供されてる。GNAT-Modified GPLというのはGPLに次の例外を足したものだ。

As a special exception, if other files instantiate generics from this unit or you link this unit with other files to produce an executable, this unit does not by itself cause the resulting executable to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU Public License.

つまり、ユーザーが作ったバイナリがランタイムライブラリにリンクしていてもGPLにしなくてもOKということだ。この例外のおかげで商用アプリケーションでクローズドソースなAdaソフトウェアが開発できる。一応補足しておくと、コンパイラがGPLであっても生成されるバイナリがGPLになる訳ではない。コンパイラのコードをリンクするわけではないからだ。

GNAT Proにはコンパイラや標準ライブラリだけでなく、様々なツール(GtkAdaやXML/Adaなどの追加ライブラリ、GPSなどの開発環境)も含まれる。

AdaCoreはGNAT Proと同等のコンパイラとライブラリ、ツール群を無料でも提供していた。これがいわゆる「pリリース」であり、pはPublicの意味らしい。基本的にはGNAT Proと同じ内容であるが、サポートは得られない。ライセンスはGNAT Proと同じく、ライブラリ部分はGNAT-Modified GPLで提供されていたため、AdaCoreによるサポートが必要なければ、pリリースでもクローズドソースのソフトウェアの開発に使用することが出来る。現在のところこのシリーズは役目を終えており、2002年10月24日にリリースされた3.15pを最後に更新が止まっている。

pリリースの役目を引き継いだコンパイラの1つがFSFのGCCの一部として提供されるGNATだ。これはAdaCoreが開発しているGNAT Proのコンパイラと標準ライブラリ部分をFSFのGCCのソースツリーにマージしたものである。これによりFSFが提供元となり、AdaCoreによる「GCCをバックエンドに使用するGANT」からFSFの「GCCのフロントエンドの1つであるGNAT」に立場が入れ替わっていると言える。もちろん開発自体は引き続きAdaCoreが主体となっているのだが、提供元が移動した事は認識しておくべきだ。FSFのGCCリポジトリに初めてGNATのコードがマージされたのが2001年10月1日である。そして3.15pがリリースされた1年後の2003年10月21日に、再び大規模なマージが行われた。その後はGCCのバージョンアップに伴い、AdaCore内部のリポジトリからその都度マージされているようだ。ライセンスはpリリースと同じく標準ライブラリ部分がGNAT-Modified GPLなので、クローズドソースのソフトウェア開発にも使用できる。Debianなどは3.15pの次はFSFのGCCをそのままAdaコンパイラとして採用しているようだ。ただし、FSFのGCCが提供するのはコンパイラと標準ライブラリだけであり、追加のライブラリや開発環境は含まれていない。FSF版GNATはGNAT/GCCと呼ばれることがある。

pリリースの役目を引き継いだもう1つのコンパイラがGNAT GPLである。GNAT GPLは現行GNAT ProのGPL版であり、AdaCoreが直接提供してるという意味ではpリリースの正式な後継である。GNAT ProのGPL版なので、標準ライブラリだけでなく、各種ツールもGPL版が提供されている。ただし、GNAT GPLはFSF版と違い、標準ライブラリのライセンスもGPLに変更されている。これはつまりGNAT GPLでコンパイルしたバイナリはほぼ確実にGPLになるということであり、クローズドソースのソフトウェア開発には使用できないことを意味する。

GNAT GAPはGNAT Proのアカデミック版である。ライセンスはGPLになるようだが、無料でサポートを受けることが出来るようになるらしい。現時点では日本国でGAPのメンバーになっている大学は存在しないようなので、あまり関係ないだろう。学生個人で契約することが出来るのかどうかは問い合わせてみて欲しい。


ではどの種類のコンパイラを使えばいいのかという話であるが、現在の選択肢としては、3.15p、FSF版、GNAT GPLが挙げられる。このうち3.15pはAda05に対応していないので除外すると、FSF版かGNAT GPLになる。ライセンスを基準に考えると、FSF版のGNATが一番無難であろう。ツール類はGNAT GPLにしか含まれていないが、どちらにしろソースコードでの提供となるので、ソースだけをもらってきて、FSF版でコンパイルしても大差はない。

コンパイラのバージョンとしては、FSF版はそのバージョンのGCCをバックエンドにする形でその都度GNAT Proからマージされたコードを使用する。GPL版は(ベースとなるGNAT Proもだが)現在のところGCC4.1.1をベースにパッチを当てる形になっている。どちらも元はGNAT Proなので、Adaフロントエンド部分については大差ないはずである。バックエンドのバージョンの違いがどれぐらい影響するかは要調査だが、そこまで気にしなくてもいいだろう。むしろ問題は使っているシステムのGCCのバージョンであり、4.3より古いGCCを使うぐらいならばGNAT GPL版を使う方がいいかもしれない。CentOSなどはGCC4.1.2が現時点での標準だが、このバージョンだと例えばAWSのコンパイルに失敗したりする。GCC4.3以降を独自にコンパイルすることが出来るならばFSF版でもかまわないかもしれないが、コンパイル済みのGNAT GPLをもらってきた方が早いケースもあるだろう。


さて、OS Xの話に移ろう。まず、デフォルトではGNATはインストールされていない。Xcodeを入れたところで状況は変わらず、さらにはMacPortにあるGCCもAdaをサポートしていない(Fortranはサポートするのに!)。また、AdaCoreはGNAT GPL 2008について、OS X用のバイナリは提供していない。2007まではあったのだがなぜか無くなってしまった。

そんなわけで、Adaコンパイラを手に入れるためにはどこからかバイナリを拾ってくるか、別の環境でクロスコンパイルする必要がある。面倒なことに、Mac上でソースコードから自力コンパイルすることはできない。AdaコンパイラのフロントエンドはAdaで書かれているので、Adaコンパイラが無い環境ではコンパイルできないのである。

選択肢は3つある。1つはThe GNU Ada Projectが提供するコンパイル済みGNAT/GCCを使用することだ。これはMacPortsの機能を使っているので、先にMacPortsをインストールする必要がある。

もう1つが、Adapowerが提供しているMacAdaを使用する方法だ。こちらもソースはGNAT/GCCである。歴史的にはこのMacAdaの方が古く、PPCアーキテクチャ用のバイナリも用意されている。しかも、XOrg用のプラグインまでついてくる。

最後の1つが、Drew's Public Folderにある、コンパイル済みのコードを使う方法になる。DrewさんはMacAdaのメンバーの一人らしい。各アーキテクチャごとにバイナリが用意されている。更新頻度が高いらしくテスト用のGCC4.4版があったりもするので、早いのが好きな人には向いているかもしれない。インストーラは付属しないが、アーカイブを展開すればそのまま使用できる。

どちらがいいのか、というのはこれまた難しい話で、手軽に使うならばMacAdaの方が楽である。インストーラが/usr/local/ada-4.3に必要なものを全て入れてくれるので、それを使えばいい。一方MacPortsを使う最初のものは/opt/local/bin/にgnatmakeが置かれる。ただしこちらはコマンドをたたくのが少々面倒で、gnatmakeが内部で呼び出すgccのコマンド名がそのままになっているため、そのままだと/usr/bin/gccが呼ばれてしまいエラーになる。本来使わなければいけないgccのパスは/opt/local/bin/gcc-mp-4.3なので、--GCCにこのパスを渡すか、あるいはシンボリックリンクを作るなりしなければいけない。Drew版は展開してそのまま使えるのでシンプルなのが好きならばこれも選択肢に入るだろう。

GNAT/GPLが使いたい場合は、2007-Tiger-PPC版ならばThe GNU Ada Projectに残っている。2008が使いたい場合は、ソースからコンパイルする必要がある。