「make」:準備
能書き
Visual Studioのような統合開発環境なら良いのですが、 UNIXの黒い画面上で毎回コンパイルのコマンドを打ち込むのはなかなか面倒です。 多数のモジュールの間に依存関係があると、もうやってられません。 そこで、「make」というUNIXコマンドの力を借りましょう。makeというのは、事前にコンパイルのコマンドを「makefile」というファイルに書いておき、それを実行する、という一種のバッチ処理です。プログラミングの効率が上がるので、ぜひ使いこなして下さい。
1. makefileを作る
makefileの雛形
下のリンクを右クリックして、「リンク先を保存」します。保存場所は当然、プログラム本体と同じ場所に。名前(拡張子無し)は重要なので、いじらないように。makefile
テキストエディットで開くと、中身は次のようになっています。
『makefile』を右クリック > このアプリケーションで開く > テキストエディット.app
# --------------------------
# | makefile template v1.1 |
# --------------------------
### rules for GNU make ###
%.o : %.f90
$(FC) $(OPT) $(DEBUG) -c $<
%.exe ::
$(FC) $^ $(OPT) $(DEBUG) $(LIBS) -o $@
### macros ###
FC = ifort
LIBS = -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lpthread -lm -ldl
OPT = -O2 -ip -mkl=sequential
## for parallelized codes
#LIBS = -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -liomp5 -lpthread -lm -ldl
#OPT = -O2 -ip -qopenmp -mkl=parallel
## for debug
#DEBUG = -C
### dependencies ###
Test.exe : bacs.o ranpack.o timer.o test_sub.o test.o
# clean up
clean:
rm -f *.o *.mod *∼
「タブ文字」にも意味があるので、スペースで置き換えてしまうと動きません。
よくわからない呪文だらけ?気にしない、気にしない。makeを極めることが目的ではないので。使えれば良いのです。
少しだけ説明しておきましょう。
FC = ifortでFortranのコンパイラを、
LIBS = ...の行でLAPACKを指定しています。(*ここの設定は環境により変える必要があります。)
#DEBUG = -Cの行のコメントアウト記号"#"を消すと、デバッグモードになります。遅くなるので、デバッグが終わったらコメントアウトしてmake clean, makeをし直して下さい。
makefileの編集
「makefile」をテキストエディットで開き、『dependencies』の下の部分をいじる。 他は触らない。書式は、
実行ファイル名.exe : 基本モジュール.o モジュール.o 本体.oという形。
『実行ファイル名.exe』はデフォルトの実行ファイル名である『a.out』を置き換えるもの。拡張子『.exe』をつけること。
拡張子を『.exe』にしたのは著者の趣味。わかりやすいので。
『:』の右側はオブジェクトファイル(ソースファイルの拡張子を『.o』にしたもの)のリスト。注意点は1つだけ。
use「する」モジュールの左側にuse「される」モジュールがあるようにする。
同じ場所に複数のプログラムがある場合、
Test.exe : bacs.o ranpack.o timer.o test_sub.o test.o Ising3D.exe : bacs.o ranpack.o ising3d.oのように書き並べていく。
実践
いつも打ち込んでいるコンパイルコマンドの代わりに、$ makeと打ち込む。
正しいmakefileが書けていれば、それだけで自動的にコンパイルしてくれる。
『makefile』に複数のプログラムを書き込んだ場合は、 どれをコンパイルするか指定して実行する。
$ make Ising3D.exeまた、
$ make cleanとすると、中間ファイルの類(".o")を消去してくれる。
コンパイルオプションを変えた時などは、一度cleanしてからmakeすること
いいところ
コンパイルコマンドが短いので楽。ファイルを編集した場合、新しくなったものだけを再コンパイルしてくれる。
一度でまとめてコンパイル出来るので、モジュールを使う時に非常に便利。