[本章の内容は Cygwin 1.5.25 で確認しました]
少し前から Cygwin で gcc 4.3.2 がサポートされています。 今までの gcc 3.4.4 が gcc.exe というコマンド名であるのに対して gcc 4.3.2 は gcc-4.exe というコマンド名です。
01:~$ gcc --version gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 01:~$ gcc-4 --version gcc-4 (GCC) 4.3.2 20080827 (alpha-testing) 1 Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 01:~$
gcc-4.exe は gcc4-core パッケージに属しています。
01:~$ type gcc-4 gcc-4 is /usr/bin/gcc-4 01:~$ cygcheck -f /usr/bin/gcc-4 gcc4-core-4.3.2-1 01:~$
/usr/lib/gcc/ 以下の付属ライブラリもバージョン番号で分かれていますから共存が可能です。
01:~$ ls /usr/lib/gcc/i686-pc-cygwin/ 3.4.4/ 4.3.2/ 01:~$
ここで注目すべき点は,gcc4-ada パッケージをインストールすれば,gnat-4.exe として Ada 2005 (www.adaic.org および www.ada-auth.org を参照) を手軽に試すことができる点です。 流行を四半世紀先取りしてジェネリクスを備えた Ada 83,仮想関数を採り入れた Ada 95 に続き,Ada 2005 では限定的な多重継承の代用としての Java ライクな interface を採り入れたほか, 言語仕様のあちこちを強化しています。
言語仕様が長期にわたり大胆に拡張されながら,初期から連続性を保ち,まとまりのよさを維持している点は, 健全な成長に失敗する例が多いプログラミング言語界にあって模範とすべき貴重な例といってよいかもしれません。
gcc 4.3.2 に含まれる GNU Ada コンパイラ gnat 自体のリファレンス・マニュアルは下記にあります。
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gnat_rm/
gcc4-ada をはじめる良いてほどきは,
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gnat_ugn_unw/
にある gcc 4.3.2 用の "GNAT User's Guide" の最初の1章 "Getting Started with GNAT" を 1.4 節 "Using the gnatmake Utility" まで試すことです。
ただし,Cygwin では従来の gcc との共存のためコマンド名を変えていますから,次のように読み替える必要があります。
gcc ⇒ gcc-4 gnatbind ⇒ gnatbind-4 gnatlink ⇒ gnatlink-4 --GCC=gcc-4 gnatmake ⇒ gnatmake-4 --GCC=gcc-4 --GNATBIND=gnatbind-4 --GNATLINK="gnatlink-4 --GCC=gcc-4"
各コマンドは "-4" 付きの名前に改名されていますが,各コマンドが依存する他のコマンド名をそのままにして パッケージを作成しているために,そのままでは実行時に依存するコマンドを見つけることができなくなります (このこと自体はほとんど gcc4-ada-4.3.2-1 パッケージのバグですが…)。 上記の読み替えでのオプション指定は,改名後の他コマンド名を陽に指定するものです。
もしも ~/.bash_profile で下記のように ~/bin/ にプライベートに PATH を最優先で通しているならば,
# Set PATH so it includes users' private bin if it exists
if [ -d "${HOME}/bin" ] ; then
PATH=${HOME}/bin:${PATH}
fi
さしあたり,次のようにシンボリック・リンクをはれば読み替えが不要になります。
01:~$ cd bin 01:~/bin$ ln -s /usr/bin/gcc-4 gcc 01:~/bin$ ln -s /usr/bin/gnatbind-4 gnatbind 01:~/bin$ ln -s /usr/bin/gnatlink-4 gnatlink 01:~/bin$ ln -s /usr/bin/gnatmake-4 gnatmake
ただし,gcc から /usr/bin/gcc-4 へのシンボリック・リンクは Ada 以外のプログラムのコンパイルにも影響がありますから, 普段は消しておくなり,
01:~/bin$ mv gcc gcc~
のようにシンボリック・リンクを別の名前にして,Ada 用に使うときだけ gcc という名前にするなりします。
GNU の流儀にしたがい,可能なオプション類は --help オプションで確認できます。 gnatmake および gcc のオプションとして -gnaty を与えるとコーディング・スタイルのチェックをしてくれます。 gnatmake の他の重要なオプションとして下記があります。
-gnatwa オプショナルな警告を出力するようにする。 -gnatW8 ワイド文字のエンコーディングを UTF-8 として読む。同類に -gnatWe (EUC), -gatWs (SJIS) など。
エディタは Meadow 2.10 以降 (または同等の Emacs) が使えます。 Ada モードは他の言語モードと同じ感覚で使えます。 自動インデントが賢く,使っていて心地よく感じます。 デフォルト設定は当然ながら GNAT 推奨スタイルに従っています。 元々 GNAT がアメリカ空軍の委託によって開発されたことと関係があるのか知りませんが, このスタイルは ACM SIGAda の記事でも広く使われており,事実上,業界標準といってよさそうです。
個々のコマンドを個別に使うこともできますが,上記で紹介した "Using the gnatmake Utility" にあるように gnatamke だけで実際の作業には十分です。 複数のファイルからなるプログラムでも,依存関係を自動的に調査してコンパイルします。 例えば,次の三つのファイルがあるとします。
gmain.adb:
with Greetings; procedure Gmain is begin Greetings.Hello; Greetings.Goodbye; end Gmain;
greetings.ads:
package Greetings is procedure Hello; procedure Goodbye; end Greetings;
greetings.adb:
with Ada.Text_IO; use Ada.Text_IO; package body Greetings is procedure Hello is begin Put_Line ("Hello WORLD"); end Hello; procedure Goodbye is begin Put_Line ("Goodbye WORLD"); end Goodbye; end Greetings;
あらかじめ,前節のように ~/bin/ にコマンド名の読み替え不要のためのシンボリック・リンクを作ってあるとします。 このとき,次のようにコンパイルして実行できます。
01:~/tmp/ada$ ls gmain.ada greetings.adb greetings.ads 01:~/tmp/ada$ gnatmake gmain gcc-4 -c gmain.adb gcc-4 -c greetings.adb gnatbind-4 -x gmain.ali gnatlink-4 gmain.ali --GCC=gcc-4 01:~/tmp/ada$ ls gmain.adb gmain.exe* greeings.adb greeings.ali gmain.ali gmain.o greeings.ads greeings.o 01:~/tmp/ada$ ./gmain Hello WORLD Goodbye WORLD 01:~/tmp/ada$
今度は -g スイッチでデバッグ情報を付けてコンパイルしてみます。 すでにコンパイル済みのプログラムですから,-s スイッチも与えます。 これは,前回からコンパイラ・スイッチが変更されていた場合に再コンパイルを起こします。 デバッグ情報付きですから,gdb でソースコード・デバッグができます。
01:~/tmp/ada$ gnatmake -s -g gmain gcc-4 -c -g gmain.adb gcc-4 -c -g greetings.adb gnatbind-4 -x gmain.ali gnatlink-4 gmain.ali --GCC=gcc-4 -g 01:~/tmp/ada$ ls b~gmain.adb b~gmain.ali gmain.adb gmain.exe* greetings.adb greetings.ali b~gmain.ads b~gmain.o gmain.ali gmain.o greetings.ads greetings.o 01:~/tmp/ada$ ./gmain.exe Hello WORLD Goodbye WORLD 01:~/tmp/ada$ gdb gmain GNU gdb 6.8.0.20080328-cvs (cygwin-special) Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-cygwin"... (gdb) list 1 with Greetings; 2 procedure Gmain is 3 begin 4 Greetings.Hello; 5 Greetings.Goodbye; 6 end Gmain; (gdb) break Gmain Breakpoint 1 at 0x4013ee: file gmain.adb, line 4. (gdb) run Starting program: /home/suzuki/tmp/ada/gmain.exe [New thread 880.0x42c] [New thread 880.0x294] Breakpoint 1, gmain () at gmain.adb:4 4 Greetings.Hello; (gdb) s greetings.hello () at greetings.adb:5 5 Put_Line ("Hello WORLD"); (gdb) where #0 greetings.hello () at greetings.adb:5 #1 0x004013f3 in gmain () at gmain.adb:4 (gdb)