Makefile
Makefileとはmakeコマンドを実行したときに読み込まれるテキストファイル。 makeとは、C言語などのソースファイルが複数存在していても、自動で順番を把握しコンパイルするコマンドである。 Eosでは、makeをつかってコマンドをまとめ、大きな仕事(電子線トモグラフィーや単粒子解析など)をさせます。分散環境とストリーム実行、入出力記述の自由度の拡大を目的として、次世代makeとして、PIONEを現在開発中です。
EosにおけるMakefile
3次元再構成をEosで行う場合、ファイル数が莫大になると、1つずつコマンドを打ち込んでいては多大な労力を必要としてしまう。
この労力を削減するために、Eosはmakeコマンドを使って実行することが必要であることが多い。
また、makefileを理解するためにはシェルスクリプトの知識も必要となる。
.ref3d.red2d: (1)
mrc3Dto2D -i $*.ref3d -o $*.ref2d -EulerMode YOYS InterpolationMode 0 -Rot1 0 359 $(STEP) -Rot2 0 359 $(STEP) -Rot3 0 0 $(STEP) -m 1
例えば、上記のようなMakefileがあったとして、
$ make EM.ref2d
makeコマンドを上のように実行すると、自動で拡張子.ref2dを生成する行を探し実行してくれる。
今回は(1)の部分が、拡張子.ref3dファイルから.ref2dファイルを生成するという意味を表しており、以下の部分を実行する。
mrc3Dto2D -i $*.ref3d -o $*.ref2d -EulerMode YOYS InterpolationMode 0 -Rot1 0 359 $(STEP) -Rot2 0 359 $(STEP) -Rot3 0 0 $(STEP) -m 1
この行が、先程の(1)に属していることを表すために、先頭にTabによる空行が挿入されている。 つまり、Tabによる空欄がなくなるまで、(1)に属する領域ということになる。
更に、以下のようにmakeをmakeするMakefileを作れば、複数の工程を1度のmakeで実行することができる。 このように、3次元再構成など複数の工程が必要な作業においてMakefileは必需品となる。
All:: make $(TARGET).ref3d; make $(TARGET).ref2d; make AVGs; make -j $(JOP_NUM) corinfo; make CORINFOs; make $(TARGET).ds6;
Makefile作成での注意点
シェルスクリプトとの構文の違い
makefileの構文は基本的にシェルスクリプトと同じであるが、中には違う規則もある。これはmakefileが1行1行でシェルスクリプトを実行するためである。ここではそれらの違いによる注意点を示す。
変数
変数の値は1行内でしか保持されない。行をまたぐときは;と\を使用する。さらにシェルスクリプトにて変数を使用するときには$iのように記述するが、Makefileにおいては$$iのように$を2つ重ねて記述する。
i=1 ; \ echo "$$i"
制御文、ループ文
制御文、ループ文を記述するときは1行で文を閉じなければならない。
if [ (条件) ]; then (処理); fi
条件、処理が長いときは\を使うと行をまたぐことができ、読みやすいようになる。
if [ (条件1) ]; then \ (処理A); \ if [ (条件2) ]; then \ (処理B); \ fi; \ (処理C); \ fi
for (( i=0; i<5; i++ )); \ do \ echo "$$i"; \ done
このとき途中でコメントアウトの#を使用すると、以降の処理までコメントアウトされてしまい、エラーや予期しない動作となってしまう恐れもあるので注意が必要である。
for (( i=0; i<5; i++ )); \ do \ echo "$$i"; \ # echo "Test"; \ done
上記の場合、echo "Test"; だけでなくdoneもコメントアウトしたことになるので、構文エラーとなる。