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 にそう書くってーの!
つかえねーじゃん!!
-includeでmodファイルを指定すれば、fuga.modがなくてもいけますよ。
返信削除参考:
・http://d.hatena.ne.jp/wagavulin/20120405/1333629926
・https://github.com/lamsh/config/blob/master/dotfile/.vim/template/Makefile
コメントありがとうございます。
返信削除これは 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 に依存関係を出力させる手段が必要なのですが、私は見つけることができませんでした。
む…。たしかにうまくいきませんね。確認不足でした。
削除include文ならうまくいくのですけど,useだとダミーのファイルが出力されませんね…。
こちらでも調べてみました。やはりありませんね…。
削除諦めてコンパイルの順番に気をつけるか,依存関係をMakefileに手動で書くしかなさそうですね…。
それかuseではなく,includeで代用するかですかね。includeはあまり推奨されていないようなので,気後れしますが(苦笑)。