UbuntuにおけるGnat-gpl 2013とASIS 2013のインストール
- Enlish version: Installing GNAT-GPL-2013 and ASIS-GNAT-2013 on Ubuntu
はじめに_
Ada 2012プログラムとAda Semantic Interface Specification(ASIS) 2013を利用するためにGnat-GPL-2013をインストールし、その後ASIS 2013を使えるようにする。
リファレンス_
- en.wikibooks: Ada Programming
- en.wikibooks: Ada Programming/Installing:何インストールすれば良いの?という疑問への答え。コンパイラーの種類の紹介。
- LIBREにあるドキュメントへのリンク
- Google Group: comp.lang.ada:Adaに関するメーリングリストのアーカイブ
- Pascal 日和 ホームページ - GNAT(Ada) コンパイラの設定:Windows環境でのGNAT-GPL-2013のインストール
インストール環境_
- Ubuntu 12.04 LTS (Precise Pangolin)
- 64bit CPU用カーネル(x86_64)
ダウンロード_
学術利用の場合はGPLで利用可能なので、以下からGNAT、ASIS、GNAT、GNATCOLLをダウンロードする。ダウンロードの際にはメールアドレスの登録が必要。
- LIBRE:Gnat-GPL-2013の配布元
私の環境が ダウンロードしてきたファイルは1つのファイルにまとめられているのか解凍する。
% mkdir Ada2013 % mv /tmp/AdaCore-Download-XXXXX.tar Ada2013 (XXXXはダウンロードに応じて自動割り振り) % cd Ada2013 % tar xvf AdaCore-Download-XXXXX.tar % mv x86_64-linux/2013/* . (ディレクトリが深いと作業が面倒なため) % rm -rf x86_64-linux/
現在の ~/Ada2013 構成はこのような状況。
% cd ~/Ada2013 % tree ├── AdaCore-Download-2013-12-05_0553.tar ├── aunit │ └── README ├── gnatcoll │ ├── README │ └── gnatcoll-gpl-2013-src.tgz └── gnatgpl ├── README ├── gnat-gpl-2013-x86_64-pc-linux-gnu-bin.tar.gz └── sources └── asis-gpl-2013-src.tgz
GNATのインストール_
% cd gnatgpl % tar xvfz gnat-gpl-2013-x86_64-pc-linux-gnu-bin.tar.gz % cd gnat-gpl-2013-x86_64-pc-linux-gnu-bin % sudo ./doinstall (インストールディレクトリを尋ねられるのでデフォルトの/usr/gnatにしておく)
コマンドサーチパスに/usr/gnat/bin を付け加える。現在のコマンドサーチパスは以下のようにして調べる。以下で表示されるディレクトリの中に/usr/gnat/binが含まれていないと、/usr/gnat/bin以下に置いてあるコマンドを実行できない(絶対パスで表示すれば実行できる)
% env | grep "^PATH"
環境変数の設定_
以下の理由により環境変数を設定する必要がある
- コマンドサーチパスに/usr/gnat/bin を加えるため、環境変数PATHを編集する
- DebianやUbuntuでは、/usr/lib/x86_64-linux-gnu をLD_LIBRARY_PATHとLIBRARY_PATHにつけ加える必要がある(参考:comp.lang.ada: Gnattest under Debian/Ubuntu Linux/Linux Lint
環境変数を設定設定するため/etc/profile.d/gnat.shを作成する。
% sudo touch /etc/profile.d/gnat.sh
中身は以下のようにする。
export PATH=/usr/gnat/bin:$PATH export LD_LIBRARY_PATH=/usr/gnat/lib:/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH export LIBRARY_PATH=/usr/gnat/lib:/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu export ADA_PROJECT_PATH=/usr/gnat/lib/gnat
許可権限を変更する
% sudo chmod 755 gnat.sh
これで次回ログイン時から有効になる。
インストールされているか確認する。
% gnatmake --version GNATMAKE GPL 2013 (20130314)
GNATCOLLのインストール_
ASIS 2013にて利用するのでGNATCOLLをインストールする。
解凍する。
% cd ~/Ada2013/gnatcoll % tar xfz gnatcoll-gpl-2013-src.tgz % cd gnatcoll-gpl-2013 % ./configure --without-gtk --prefix=/usr/gnat --enable-shared \ --without-python --disable-pygtk |& tee configure.log % make |& tee make.log % make test % sudo make install
ASIS-for-GNAT 2013のインストール_
% cd ~/Ada2013/gnatgpl/sources % tar xvfz asis-gpl-2013-src.tgz % cd asis-gpl-2013-src
ASIS-for-GNATとGNAT-GPLのバージョンは一致していなければならない。以下のコマンドでGNATのバージョンを確認。2013同士で適合している。
% gnatls -v GNATLS GPL 2013 (20130314) Copyright (C) 1997-2013, Free Software Foundation, Inc. Source Search Path: <Current_Directory> /usr/gnat/lib/gcc/x86_64-pc-linux-gnu/4.7.4/adainclude/ Object Search Path: <Current_Directory> /usr/gnat/lib/gcc/x86_64-pc-linux-gnu/4.7.4/adalib/ Project Search Path: <Current_Directory> /usr/gnat/lib/gnat /usr/gnat/x86_64-pc-linux-gnu/lib/gnat /usr/gnat/share/gpr /usr/gnat/lib/gnat
インストールする。
% make all install prefix=/usr/gnat
ここまで終えてASIS-for-GNAT User's Guide: 2.4 Building the Executable for an ASIS applicationを実行するとうまくコンパイルできない。
% gnatmake example1.adb -largs -lasis gcc -c example1.adb example1.adb:5:06: file "asis.ads" not found example1.adb:6:06: file "asis-implementation.ads" not found example1.adb:7:06: file "asis-ada_environments.ads" not found example1.adb:8:06: file "asis-compilation_units.ads" not found example1.adb:9:06: file "asis-exceptions.ads" not found example1.adb:10:06: file "asis-errors.ads" not found gnatmake: "example1.adb" compilation error
原因の一つはASISのライブラリディレクトリやインクルードディレクトリを読み込めていないため。/etc/profile.d/gnat.sh に以下を加える。現在参照しているディレクトリについては「gnatls -v」で確認することができる。
export ADA_INCLUDE_PATH=/usr/gnat/include:/usr/gnat/include/asis:/usr/gnat/include/gnat_util export ADA_OBJECTS_PATH=/usr/gnat/lib:/usr/gnat/lib/asis
原因の二つ目は asis-gpl-2013-src で生成されているadbが/usr/gnat/include/asisに移動していないため。そこで移動させる。
% sudo cp ~/Ada2013/gnatgpl/sources/asis-gpl-2013-src/asis/*.adb /usr/gnat/include/asis
また、/usr/gnat/include/gnat_util 以下にも足りないadbファイルがあるらしく、ASIS-for-GNAT User's Guide: 2.4 Building the Executable for an ASIS applicationを実行するとうまくコンパイルできない。しかし、/usr/gnat/include/gnat_util には、~/Ada2013/gnatgpl/gnat-gpl-2013-x86_64-pc-linux-gnu-bin/include/gnat_util 以下にあるファイルがすべてコピーされているので、追加のadbファイルはもうない。
そこで、GNAT-GPL-2012のファイルを利用する。LIBREからgnat-gpl-2012-x86_64-pc-linux-gnu-bin.tar.gzをダウンロードし、解凍する。
% cp gnat-gpl-2012-x86_64-pc-linux-gnu-bin.tar.gz ~/Ada2013 % tar xvfz gnat-gpl-2012-x86_64-pc-linux-gnu-bin.tar.gz % cd gnat-gpl-2012-x86_64-pc-linux-gnu-bin/include/gnat_util/
2012年版のinclude/gnat_util/以下にある以下のadbファイルを/usr/gnat/include/gnat_utilにコピーする。これらのファイルは、1) 2012年版と2013年版でinclude/gnat_util/に同じファイル名のadsファイルが存在する 2)2012年版でinclude/gnat_util/にadsファイルと同じ名前のadbファイルがある(xxx.adsがあるとき、xxx.adbがある) 3) 2012年版と2013年版でadsファイルの内容が変わっていない or 変わっているのは定数の定義だけ。という条件を満たすadbファイルを選んだ(選ぶためのスクリプトは付録参照)。
binderr.adb gnatvsn.adb prj-attr-pm.adb prj-pp.adb stylesw.adb butil.adb krunch.adb prj-attr.adb prj-proc.adb switch-m.adb debug.adb mlib-fil.adb prj-dect.adb prj-strt.adb tree_in.adb fmap.adb mlib-tgt.adb prj-err.adb sdefault.adb tree_io.adb fname-uf.adb mlib-utl.adb prj-ext.adb sinput-c.adb uname.adb fname.adb mlib.adb prj-nmsc.adb stand.adb widechar.adb
上記ファイルを/usr/gnat/include/gnat_utilにコピーして、サンプルプログラムをコンパイルするとうまく動く。
% gnatmake example1.adb -largs -lasis ~省略~ % ./example1 A Context contains the following compilation units: Standard (spec) - Ada predefined unit % gcc -c -gnatct example1.adb % ./example1 example1.adt A Context contains the following compilation units: Standard (spec) - Ada predefined unit Example1 (body) - user-defined unit Ada (spec) - Ada predefined unit Ada.Wide_Text_IO (spec) - Ada predefined unit Ada.IO_Exceptions (spec) - Ada predefined unit ~省略~
付録:/usr/gnat/include/asisのファイルと~/Ada2013/gnatgpl/sources/asis-gpl-2013-src/asisの差分_
/usr/gnat/include/asisのファイルと~/Ada2013/gnatgpl/sources/asis-gpl-2013-src/asisの差分は以下のとおり。
% ls -1 /usr/gnat/include/asis > installed_include_asis.txt % cd ~/Ada2013/gnatgpl/sources/asis-gpl-2013-src/asis % ls -1 *.ads *.adb > ../compiled_asis_adb_ads.txt % diff installed_include_asis.txt compiled-asis_ads.txt | grep adb > a4g-a_debug.adb > a4g-a_elists.adb > a4g-a_opt.adb > a4g-a_osint.adb > a4g-a_output.adb > a4g-a_sem.adb > a4g-a_sinput.adb > a4g-a_types.adb > a4g-asis_tables.adb > a4g-contt-dp.adb > a4g-contt-sd.adb > a4g-contt-tt.adb > a4g-cu_info2.adb > a4g-dda_aux.adb > a4g-decl_sem.adb > a4g-defaults.adb > a4g-encl_el.adb > a4g-expr_sem.adb > a4g-get_unit.adb > a4g-gnat_int.adb > a4g-itests.adb > a4g-knd_conv.adb > a4g-mapping.adb > a4g-norm.adb > a4g-queries.adb > a4g-skip_tb.adb > a4g-span_beginning.adb > a4g-span_end.adb > a4g-stand.adb > a4g-u_conv.adb > a4g-vcheck.adb > asis-ada_environments-containers.adb > asis-ada_environments.adb > asis-clauses.adb > asis-compilation_units-relations.adb > asis-compilation_units-times.adb > asis-compilation_units.adb > asis-data_decomposition-aux.adb > asis-data_decomposition-debug.adb > asis-data_decomposition-set_get.adb > asis-data_decomposition-vcheck.adb > asis-declarations.adb > asis-definitions.adb > asis-elements.adb > asis-expressions.adb > asis-extensions-flat_kinds.adb > asis-ids.adb > asis-implementation-permissions.adb > asis-implementation.adb > asis-limited_views.adb > asis-statements.adb > asis-text-set_get.adb > asis-text.adb
付録:GNAT-GPL-2012とGNAT-GPL2013のファイルの違い_
% cd ~/Ada2013/gnat-gpl-2012-x86_64-pc-linux-gnu-bin/include/gnat_util % ls -1 *.ads > ~/Ada2013/gnat-gpl-2012-include-ads.txt % ls -1 *.adb > ~/Ada2013/gnat-gpl-2012-include-adb.txt % cd ~/Ada2013/gnatgpl/gnat-gpl-2013-x86_64-pc-linux-gnu-bin/include/gnat_util % ls -1 *.ads > ~/Ada2013/gnat-gpl-2013-include-ads.txt % ls -1 *.adb > ~/Ada2013/gnat-gpl-2013-include-adb.txt
include/gnat_utilの違い(ファイル名のみ) adsファイル
% diff gnat-gpl-2012-include-ads.txt gnat-gpl-2013-include-ads.txt 27d26 < mlib-tgt-vms_common.ads 79a79 > xutil.ads
2012年版にはmlib-tgt-vms_common.adsがあるが、xutil.adsはない。2013年版はその逆。
include/gnat_utilの違い(ファイル名のみ) adbファイル。2012年版にはあるが2013年版にはないファイルが大量に存在する。
% diff gnat-gpl-2012-include-adb.txt gnat-gpl-2013-include-adb.txt 2d1 < ali.adb 5,6d3 < binderr.adb < butil.adb 9d5 < debug.adb 12,19d7 < errout.adb < erroutc.adb < errutil.adb < fmap.adb < fname-uf.adb < fname.adb < gnatvsn.adb < krunch.adb 24,26d11 < mlib-fil.adb < mlib-tgt-specific-vms-alpha.adb < mlib-tgt-specific-vms-ia64.adb 28,31d12 < mlib-tgt-vms_common.adb < mlib-tgt.adb < mlib-utl.adb < mlib.adb 35d15 < osint.adb 37,40d16 < prj-attr-pm.adb < prj-attr.adb < prj-conf.adb < prj-dect.adb 42,48d17 < prj-err.adb < prj-ext.adb < prj-nmsc.adb < prj-part.adb < prj-pp.adb < prj-proc.adb < prj-strt.adb 56d24 < sdefault.adb 59d26 < sinput-c.adb 63d29 < stand.adb 66,67d31 < stylesw.adb < switch-m.adb 70,73d33 < targparm.adb < tempdir.adb < tree_in.adb < tree_io.adb 76d35 < uname.adb 78d36 < widechar.adb
付録:2012年版のADSファイルと2013年版のADSファイルを比較するスクリプト_
今回比較した手順
% cd ~/Ada2013 % mkdir diff-include % cp -r gnat-gpl-2012-x86_64-pc-linux-gnu-bin/include/gnat_util diff-include/2012-gnat_util % cp -r gnatgpl/gnat-gpl-2013-x86_64-pc-linux-gnu-bin/include/gnat_util diff-include/2013-gnat_util % cd diff-include % touch compare.sh % chmod 755 compare.sh % mkdir diff-adb
compare.shでやる内容は以下のとおり。
- 2012年版と2013年版でinclude/gnat_util/に同じファイル名のadsファイルが存在する
- 2012年版でinclude/gnat_util/にadsファイルと同じ名前のadbファイルがある(xxx.adsがあるとき、xxx.adbがある)
- 2013年版ではそのadbファイルがない
- 2012年版と2013年版でadsファイルの内容がまったく同じならば、DIFFDIRへそのadbファイルをコピーする
- 2012年版と2013年版でadsファイルの内容が違うならば、diffの結果を標準出力へ出す。
compare.shの中身
#/bin/sh ADA2012DIR=/home/gotoh/Ada2013/diff-include/2012-gnat_util/ ADA2013DIR=/home/gotoh/Ada2013/diff-include/2013-gnat_util/ DIFDIR=/home/gotoh/Ada2013/diff-include/diff-adb if test -d $ADA2012DIR then cd $ADA2012DIR filelist="$ADA2012DIR*.ads" for filepath in ${filelist} do filename2012=`basename ${filepath}` prefixFilename=`basename ${filename2012} .ads` adbfilename2013=$ADA2013DIR${prefixFilename}.adb filename2013=$ADA2013DIR$filename2012 if test -e ${prefixFilename}.adb then if test -e $filename2013 then if ! test -e $adbfilename2013 then echo "diff 2012/$filename2012 2013/$filename2012" difference=`diff $filename2012 $filename2013` if test -z $difference then echo " $filename2012 can be copied to 2013" cp ${prefixFilename}.adb $DIFDIR else diff $filename2012 $filename2013 fi echo "=====" fi else echo "$filename2013 isn't in 2013\n" fi fi done fi
使う方法
% ./compare.sh > log.txt % ls diff-adb/ debug.adb fname.adb krunch.adb tree_in.adb uname.adb widechar.adb
あとは、log.txt を眺めてコメント欄だけの違いや定数の再定義だけのものを探した。その結果が以下の内容
binderr.adb gnatvsn.adb prj-attr-pm.adb prj-pp.adb stylesw.adb butil.adb krunch.adb prj-attr.adb prj-proc.adb switch-m.adb debug.adb mlib-fil.adb prj-dect.adb prj-strt.adb tree_in.adb fmap.adb mlib-tgt.adb prj-err.adb sdefault.adb tree_io.adb fname-uf.adb mlib-utl.adb prj-ext.adb sinput-c.adb uname.adb fname.adb mlib.adb prj-nmsc.adb stand.adb widechar.adb