Install Fortran 90 POSIX API (Posix90 library)
Fortran 90のPOSIXのAPIをインストールして,OSにアクセスが必要なディレクトリ操作や正規表現をFortranからでもできるようにする。
Introduction
Fortranを使っていると,プログラム内でディレクトリの作成・削除・移動,正規表現を利用したいことがある。しかし,これらはOSへのアクセスが必要であり標準ではできない。system
関数で外部コマンドを呼びだせば実現可能なこともある。しかし,以下2点の問題がある。
- 外部コマンドで取得した値をプログラム内で値を直接利用できない。
- OSごとにコマンドが異なるため移植性・汎用性に欠ける。
外部コマンドで取得した値を利用する場合は中間ファイルを介せば理論的には可能だ。しかし,そのためだけにファイル読み書きのコードを書く必要があり冗長だ。ディレクトリを作成するmkdir
コマンドに限れば,各OSに同名で存在するため利用可能だ。ただし,オプションはOSごとに異なるので使うと移植できない。例えば以下のようにして使う。
call system("mkdir hoge")
POSIX(Portable Operating System Interface)とは,UNIX系のOSでの最低限の共通APIの規格である。POSIXにアクセスすることでディレクトリ操作などをOSネイティブに実行できる。
FortranにおけるPOSIXへのAPIはISOで標準化されている。
IEEE (1992) : IEEE Standard for InformationTechnology – POSIX(R) FORTRAN 77 Language Interfaces – Part 1: Binding for System Application Program Interface (API) . http://standards.ieee.org/findstds/standard/1003.9-1992.html.
具体的な自由な実装としては以下二つがある。
名前 | バージョン | 最終更新日 | URL |
---|---|---|---|
Posix90 | 1.1.1.1 | 2008-06-10 | http://savannah.nongnu.org/projects |
fortranposix | 0.1-1 | 2005-08-17 | http://sourceforge.net/projects/fortranposix |
Posix90のバージョンは以下のコマンドで確認した。
cvs status -v
Posix90のほうが新しく実装が充実している。また,fortranposixはうまくインストールできなかった。Posix90をインストールしてFotranでディレクトリ作成できるようにしてみる。インストール環境は以下に示したとおりだ。
- OS:Ubuntu 14.04
- Cコンパイラ:gcc 4.8.2
- Fortranコンパイラ:gfortran4.8.2
Method
コンパイルに先立って必要なパッケージをインストールしておく。
sudo apt install texinfo texlive texi2html cvs
上記のPosix90の配布元のDownloadから辿れるバージョン0.4は古くてインストールできなかったので,CVSを使ってリポジトリから最新バージョンを入手する。
cd ~/.local/src
cvs -d:pserver:anonymous@cvs.sv.gnu.org:/sources/posix90 co .
cd posix90
# sed -i.back '5cPREFIX := ${HOME}/local/stow/posix90-1.1.1.1' Makefile
vim Makefile # 5行目付近を修正
PREFIX := ${HOME}/.local/stow/posix90-1.1.1.1
#PREFIX := /usr/local
make
make
を実行すると以下のエラーが出る。
./gpl.texi:305: This command can appear only outside of any environment, not in environment @enumerate.
@badenverr ...temp , not @inenvironment @thisenv } @checkenv ...@ifx @thisenv @temp @else @badenverr @fi @sectionheading #1#2#3#4->{@checkenv {} @csname #2fonts@endcsname @rmisbold @... @\heading ...tionheading {#1}{sec}{Yomitfromtoc}{} @suppressfirstparagraphin... l.305 @heading NO WARRANTY ?
qを入力してとりあえず抜ける。doc/gpl.texi
の305行目が原因。
@iftex
@heading NO WARRANTY
@end iftex
enumerate環境の中に見出しである@headingコマンドを書いているためエラーとなっている。該当行をコメントアウトしてmake
し直す。
sed -i.back '@comment @heading NO WARRANTY' doc/gpl.texi
make
make install
cd ~/.local/stow
stow posix90-1.1.1.1
これで~/.local/
にインストールされた。マニュアルを読めるようにINFOPATHを設定しておく。
export INFOPATH=$HOME/.local/info
Test
とりあえず動くかどうかテストしてみる。
cd ~/tmp
cat <<- EOT > hi.f90
!! \file hi.f90
!! \brief 現在位置にhi-dirというディレクトリを作成。
use f90_unix_dir
implicit none
call mkdir("./hi-dir", 0) ! 第2引数でアクセス権などを指定
end
EOT
Posix90のモジュールとライブラリを指定してコンパイルする。
gfortran hi.f90 -I$HOME/.local/f90/mod -L$HOME/.local/lib -lposix90
ソースコード(hi.f90
)をライブラリなど(-I, -L)より先に指定しないとうまくコンパイルできないので注意する。
コンパイルしてできたバイナリを以下のコマンドで実行するとhi-dir
ができる。
./a.out
How to use
すでにINFOPATHを設定しているので,以下のようにしてinfo
コマンドでマニュアルを閲覧できる。
info posix90
ソースコードのディレクトリ(~/.local/src/posix90/doc
)にmake実行時にhtmlやpdf形式でのマニュアルも生成されている。
配布元のソースコードリポジトリにtexi形式のマニュアルがある。
ただ,配布元はtexi形式でしか公開されておらず利便性が悪い。インストール前にどういう関数があるか確認できたほうがよいと思う。そこで,posix90のmake
のときに生成されたhtmlやpdf形式のマニュアル類を以下で公開した。
簡単にどういう関数があるか説明する。大まかに10種類のモジュールがある。
モジュール名 | 説明 |
---|---|
4.1 Module f90_unix_dir | Directories and files |
4.2 Module f90_unix_dirent | Directory reading |
4.3 Module f90_unix_env | Environment |
4.4 Module f90_unix_errno | Error codes |
4.5 Module f90_unix_file | File characteristics |
4.6 Module f90_unix_io | Input/Output |
4.7 Module f90_unix_proc | Process management |
4.8 Module f90_unix_regexp | Regular expressions |
4.9 Module f90_unix_signal | Signal management |
4.10 Module f90_unix_time | Time types & conversion |
個人的に特に有用だと思うのは4.1,4.2,4.8あたり。f90_unix_dirモジュールではディレクトリを作成したりできる。 f90_unix_direntモジュールでは。ディレクトリ以下から順番にファイル名を取得できる。f90_unix_regexpでは正規表現を使え るようだ。4.3のf90_unix_envは環境変数を取得したりできるが,これはgfortranの組み込み関数として同等の関数が存在するので使わなくても大丈夫だろう。
posix90モジュールを使うときは,hi.f90
のように以下の手順を踏む。
- use文で該当する.modファイルを読み込む。
- call文でモジュールで定義されている関数を呼び出す。
- コンパイル時に.modファイルの場所とlibposix90.aのある場所を-I,-Lオプションで指定し,-lposix90を付与。
関数の使い方については,マニュアルを参照すればよい。
Conclusion
記事の内容をまとめる。
- Fortran90でPOSIXのAPIにアクセスしてOSの機能を利用できるPosix90ライブラリをインストールした。
- ディレクトリを作るサンプルプログラムで動作を確認した。
- マニュアルの場所と基本的な関数,使用手順についてまとめた。
Posix90ライブラリに関する情報はほとんどなかったので,参考になれば嬉しい。
なお,このライブラリはUbuntuでしかビルドできなかった。けっこうな時間をかけてCygwinやMSYS2でのビルドも試してみたが,以下のようなエラーが出てしまい,どうにもできなかった。
cc -g -fno-leading-underscore -c -o f90_unix_signal_const.o f90_unix_signal_const.c^M f90_unix_signal_const.c: In function ‘main’: f90_unix_signal_const.c:43:51: error: ‘SIGIOT’ undeclared (first use in this nction)
cc -g -fno-leading-underscore -c -o f90_unix_env_const.o f90_unix_env_const.c f90_unix_env_const.c: In function 'main': f90_u nix_env_const.c:33:60: error: 'gid_t' undeclared (first use in this function) printf("integer, parameter :: GID_KIND = %d\n", sizeof(gid_t));
とりあえず,Linux環境では動作すると思っておくとよいだろう。