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.

具体的な自由な実装としては以下二つがある。

FotranのPOSIXのモジュール
名前バージョン最終更新日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形式のマニュアルがある。

[posix90] View of /posix90/doc/posix90.texi

ただ,配布元はtexi形式でしか公開されておらず利便性が悪い。インストール前にどういう関数があるか確認できたほうがよいと思う。そこで,posix90のmakeのときに生成されたhtmlやpdf形式のマニュアル類を以下で公開した。

uploader/posix90 at master · lamsh/uploader

簡単にどういう関数があるか説明する。大まかに10種類のモジュールがある。

Posix90が提供するモジュールと機能
モジュール名説明
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のように以下の手順を踏む。

  1. use文で該当する.modファイルを読み込む。
  2. call文でモジュールで定義されている関数を呼び出す。
  3. コンパイル時に.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環境では動作すると思っておくとよいだろう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です