ここでは, DCPAM のビルド作業の中で make コマンドが行なっていることを解説します. DCPAM のビルド作業内で make はまずコンパイルをし, その後リンクというものをしてくれます (make について詳しくは[付録1] make と Makefileを参照してください).
余り大きくないモデルなら一つのプログラムのコンパイルだけでビルドは終了します. しかしながら, 大きなモデルでは一つのプログラムだけでなく他の方が作ったプログラムを用いたいことが多々あります. その場合は, プログラムをコンパイルしてオブジェクトファイル (あるいはライブラリ) を生成し, リンクを行い実行ファイルを作ります.
オブジェクトファイル (*.o)とは実行ファイルを作成するまでにできる途中のファイルで, 計算機 (CPU) が解釈できる命令とその解釈に使われる情報が詰まっている機械語で書かれたファイルです. また, オブジェクトファイルをひとまとめにして他のソフトウエアから利用しやすい形にしたものをライブラリ (lib*.a, lib*.so) と言います.
リンクとはオブジェクトファイル (あるいはライブラリ) と他のオブジェクトファイル (あるいはライブラリ) を繋げて実行ファイルを作ることを言います.
他の方が作ったプログラムを用いたい場合は, 他の方が作ったプログラムからオブジェクトファイル (あるいはライブラリ) を生成し, それと自分のプログラムから生成したオブジェクトファイル (あるいはライブラリ) をリンクします. そうすることで他の方がつくったプログラムの機能を自分のプログラムでも用いることができるようになります.
DCPAM も他のプログラムを用いています.
DCPAM は他のプログラムを内部で利用しています. データの入力・出力には netCDF と gtool5, 空間微分の表現には ISPACK と SPMODEL というプログラムを用いています. これらは複数のプログラムから構成されるプログラム群です. そのため, オブジェクトファイルではなくライブラリを提供してくれています. これらに関する説明を表にまとめました.
プログラム名 | 説明 | Debian パッケージ | 提供するライブラリ |
---|---|---|---|
netCDF | netCDF データファイル入出力ライブラリ | netcdff と netcdfc | libnetcdff.a と libnetcdfc.a |
gtool5 | netCDF データファイルの入出力等を容易にしてくれる機能を提供するライブラリ | gtool5 | libgtool5.a |
ISPACK | 流体計算のために必要なツール (スペクトル変換等) を提供するライブラリ | ispack | libispack.a |
SPMODEL | 階層的地球流体スペクトルモデル集 | spml | libspml-lapack-lapack.a |
それぞれのプログラムの Debian パッケージが提供するライブラリの名前も表に示してあります.
DCPAM の実行ファイルを作成するまでに行なわれるビルド作業の流れの概要を図 1 に示します.
DCPAM では実行ファイル (dcpam_init_data, dcpam_init_data_surface, dcpam_main) を作るメインとなるプログラム (dcpam_init_data.f90, dcpam_init_data_surface.f90, dcpam_main.f90) とそれ以外の機能をまとめたもの (モジュールと呼びます. 例えば dynamics_hspl_vas83.F90 等) があります. モジュールはライブラリ (libdcpam.a) にし, メインとなるプログラムはオブジェクトファイルにします (例えば, dcpam_main.o 等). 最終的にメインとなるプログラムに結合し, そこからモジュールを呼び出すようにします.
make をコマンドした時 (dcpam_main の場合. dcpam_init_data および dcpam_init_data_surface も同様に行われます) の最終的な流れは以下のようになっています.
FORTRAN コンパイラには様々な種類があります (PGI Fortran, Intel Fortran, Fujitu Fortran, GNU Fortran 等). 情報実験機で使える FORTRAN コンパイラは GNU Fortran (コマンドは gfortran ) です. しかし, 情報実験機において DCPAM のビルド作業を行なう際には, spmfrt というコマンドを使うように指定します ($ export FC=spmfrt). spmfrt とは SPMODEL が提供してくれているコマンドで, 指定の FORTRAN コンパイラ (FC) に SPMODEL のライブラリを自動でリンクしてくれているものです. そのため中では gfortran を呼び出しています.
複数のオブジェクトファイルを結合してライブラリを作成するには ar コマンドを使います. ar コマンドはライブラリとオブジェクトファイルを結合して実行ファイルを作成する際にも使われます. 実は make で DCPAM をビルドする際にも ar コマンドを使っています (最後のライブラリのリンク時). ar コマンドはライブラリの中に格納されているオブジェクトファイルのリストを表示させることもできます.
$ ar -t libgtool5.a