UbuntuにおけるGnat-gpl 2013とASIS 2013のインストール

はじめに_

Ada 2012プログラムとAda Semantic Interface Specification(ASIS) 2013を利用するためにGnat-GPL-2013をインストールし、その後ASIS 2013を使えるようにする。

リファレンス_

インストール環境_

ダウンロード_

学術利用の場合は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"

環境変数の設定_

以下の理由により環境変数を設定する必要がある

  1. コマンドサーチパスに/usr/gnat/bin を加えるため、環境変数PATHを編集する
  2. 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でやる内容は以下のとおり。

  1. 2012年版と2013年版でinclude/gnat_util/に同じファイル名のadsファイルが存在する
  2. 2012年版でinclude/gnat_util/にadsファイルと同じ名前のadbファイルがある(xxx.adsがあるとき、xxx.adbがある)
  3. 2013年版ではそのadbファイルがない
  4. 2012年版と2013年版でadsファイルの内容がまったく同じならば、DIFFDIRへそのadbファイルをコピーする
  5. 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