2015年3月12日木曜日

gfortranを使った依存関係の出力

Fortran でモジュールごとにファイルを分けてコンパイルするようなケースでの話。

Makefile に hoge.o とか fuga.mod とかの依存関係を手書きしたりするんだけど、数が増えてくるとめんどくさいし間違えやすいよね。

実は gfortran には依存関係を出力する機能がある(4.9.2で確認)。

オプション -M または -MM が依存関係を出力させるオプションだ。同時に -cpp も指定する必要がある。そのままだと標準出力に出力されるが -MF file を指定してファイルに出力させることもできる。

例えば hoge.f90 の依存関係を hoge.d に出力させるなら次のようにする。

$ gfortran -cpp -MM -MF hoge.d hoge.f90

ここで hoge.f90 が 内部で USE fuga としていたとすると hoge.d は次のようになる。

hoge.o: hoge.f90 fuga.mod

しかし、コマンドの実行に先立って fuga.mod が存在していなければならない。

あれ?

fuga.f90 を先にコンパイルするってわかってたら最初から Makefile にそう書くってーの!

つかえねーじゃん!!

4 件のコメント :

  1. -includeでmodファイルを指定すれば、fuga.modがなくてもいけますよ。
    参考:
    ・http://d.hatena.ne.jp/wagavulin/20120405/1333629926
    ・https://github.com/lamsh/config/blob/master/dotfile/.vim/template/Makefile

    返信削除
  2. コメントありがとうございます。

    これは gfortran 固有の問題だと思うのですが、-MM オプションで依存関係を出力させる段階で実際に読み込む mod ファイルが存在していないといけないんですよ。

    存在してないとこんな感じでエラーになってしまいます。

    $ gfortran -cpp -MM -MF hoge.d hoge.f90
    hoge.f90:2.6:

    use fuga
    1
    Fatal Error: Can't open module file 'fuga.mod' for reading at (1): No such file or directory

    mod がなくても gfortran に依存関係を出力させる手段が必要なのですが、私は見つけることができませんでした。

    返信削除
    返信
    1. む…。たしかにうまくいきませんね。確認不足でした。
      include文ならうまくいくのですけど,useだとダミーのファイルが出力されませんね…。

      削除
    2. こちらでも調べてみました。やはりありませんね…。
      諦めてコンパイルの順番に気をつけるか,依存関係をMakefileに手動で書くしかなさそうですね…。
      それかuseではなく,includeで代用するかですかね。includeはあまり推奨されていないようなので,気後れしますが(苦笑)。

      削除