Makefileを実行するmakeコマンドは、Makefileに書かれたプログラムを実行するコマンドであるが
ファイルの更新日時を確認して、一度makeを実行してからファイルが変更されていない場合には、プログラムを実行しない。
つまりMakefileを使わないでコンパイルする場合と異なり、不要なコンパイルを抑えることができる。
SRCS = hoge1.f90 hoge2.f90 hoge3.f90 FC = ifort OBJS = ${SRCS:.f90=.o} ALL : EXE EXE : ${OBJS} ${FC} ${OBJS} -o $@ ${OBJS} : ${SRCS} ${FC} -c ${SRCS} clean : \rm -f *.o Makefile~ core
1~3行目までの変数の定義のことをMakefileではマクロの定義という。
5行目のALLで実行ファイルの名前(ここではEXE)を指定している。このALLのことをターゲット。EXEの部分のことをコンポーネントという。
以下6~9行目は、Makeの方法を書いている。これらの行は、下のコマンド(ここでは8,9行目の後に6,7行目)から実行される。
コマンドの書き方は、シェルスクリプトで基本的には同じである。
6~9行目では、それぞれのソースプログラムをコンパイルしてオブジェクトファイルを作成し、それらのオブジェクトファイルをリンクすることで
一つにまとめている。(詳しくは、他を参照)
8行目の意味するところは、${SRCS}から${OBJS}を作成するということで、その方法は、9行目に書いてある。ここで-cオプションはオブジェクトファイルの生成までということを指定している。
そして6行目の意味するところは、${OBJS}からEXEを作成するということで、その方法は7行目に書いてある。
ここで7行目の、-oオプションは実行ファイル名の指定で、$@は現在処理中のターゲット(ここではEXE)を表わす変数である。
10,11行目のcleanは、オブジェクトファイルを消去するためのコマンドである。
makeはソースの更新日時は確認するがMakefileの更新は確認しないのでMakefileの内容を変更した場合には、
make clean
を実行する。
Makefileでは、 コマンドの前にTabでスペース を空ける。普通のスペースはエラーになる。