ASISのビルド

メタプログラミングの会でASISネタで発表させていただけることになりました。
ただ……問題点がひとつ。

今までに私はASISを使ったことがありません。

というわけでしばらくASISの勉強シリーズにおつきあいください。ASISなら俺のほうが詳しいから発表代わりやがれって方は大歓迎です。

ASISってのは、ざっくり言ってしまうとCILのAda版で、Adaソースをパース/意味解析/変換/再出力するためのライブラリです。
マクロやテンプレート的な意味でのメタプログラミングライブラリではありませんので注意ください。
難点として、CILは賢明にも(極端に文字列処理に弱い)Cではなくてコンパイラのような処理が書きやすいことに定評があるO'Camlですので、とてもコードが書きやすいのですが、ASISはそれ自身(Cの次ぐらいに文字列処理に弱くさらに記述が長くて面倒なことに定評がある)Adaのライブラリですので、まあなんというか面倒だなあ、と、まだ全く手を付けていないのに確信してます。どうか外れてますように。

……で、まあ、ビルド方法。
AdaCore配布のGNATに付いてくるgnatstubやgnatpp(←ASISアプリケーション)をgccでも使いたくて、これらを野良ビルドしたことはありますのでその手順を書いておきます。こんなの発表に含めたってその場で試していただけるわけでもなし、ここにしか書きませんよ。ASISの日本語情報を読めるのはここだけ!

1. gccに対応したASISのダウンロード

先の説明をもっと正確に言いますと、ASISというのはライブラリそのものではなくてライブラリの仕様です。ですのでそれぞれのAdaコンパイラがASISも用意することになります。
ここではgcc(個人が趣味で使えるAdaコンパイラとしてはほぼ一択)に対応したASISをビルドします。

まず、GNAT GPLのサイトから2009を選択してasis-gpl-2009-src.tgzをダウンロードしてきます。メールアドレス聞かれますが空でOK。ここで最新の2010を使うと確か途中でコンパイルエラーになったような。gcc-4.5系列ですと2009でうまくいきます。

2. gccを途中までビルド

それから、当然皆さんの手元のマシンにはAdaも含めたgccがインストール済みとは思いますが、改めてgccを「途中まで」ビルドしてください。必要なのはビルド過程で生成される次の3つのファイルのみで、これらができたら止めちゃっていいです。

  • $(BUILDDIR)/gcc/version.o
  • $(BUILDDIR)/gcc/ada/snames.ads
  • $(BUILDDIR)/gcc/ada/snames.adb

3. 必要なファイルをコピー

asis-gpl-2009-src.tgzを展開して、その中のgnatディレクトリに上記snames.ads/snames.adbをコピーします。
あと細かいバージョンを揃えるために、gnatディレクトリにある他のファイルも、同名のファイルのgcc版で上書きしちゃいましょう。

4. ASISのビルド

make all gnatcheck gnatelim gnatmetric gnatpp gnatstub gnatsync

途中、バージョン関係のシンボルでリンクエラーになりますので、version.oもリンクするようにします。
libasis.a(そこまで進んでるならできてるはず)に放りこむのが一番手っ取り早いです。

ar -q lib/libasis.a version.o

5. ASISのインストール

添付makefileでインストールされる時のディレクトリ構成がちょっと気に入りませんので、一旦カレントディレクトリにでもインストールして再配置。

make INSTALL_DIR=$PWD install install-asistant install-tools
  • binの中のツール群を好きなところに移動。
  • include/asisの中のソースコードを好きなところに移動。gnatmakeの-aIまたは環境変数ADA_INCLUDE_PATHで参照します。
  • lib/asisの中のファイル群も好きなところに移動。gnatmakeの-aOまたは環境変数ADA_LIBRARY_PATHで参照します。
  • share/docの中のHTMLドキュメントも取っておきます。
  • .gprファイルを使うならasis.gprも取っておけばいいでしょう。中身はここで作ったディレクトリ構成に合わせて書き変える必要があります。