FromNandの日記

自分的備忘録

makeについて色々まとめてみた

makeについてまとめておく。(参考書籍 oreilly make 改訂版)

 

1. makeはファイルの依存関係をOSに記録された各ファイルの情報をもとに詳細に理解

 し、各ファイルを構成しているコンポーネントが最新であればコマンドを無視、そう

 でなければmakefileにかかれた依存関係をもとにコマンドを実行し、ターゲットを

 更新するという再帰的な処理を行っている。

 

2. マクロ定義部では=の前後の空白やタブはすべてないものとして処理される。

 また、行を続けるために書かれた'\'は前後の空白やタブとまとめて一つの空白として

 処理される。

 

3. makeではよくつかわれるコマンドをあらかじめマクロとして定義してある。

 $(CC)はcc、$(LD)はldなど....

 

4. コマンドラインからmakeを実行するときにマクロを定義することもできる。

 例) make target DIR=/bin

 この場合、targetとマクロの定義の順番は問わない。

 例2) make target "DIR= /bin /usr /usr/prog"

 マクロの定義が複数の文字列を含み、タブや空白を持つ場合は ' か " で囲む必要が

 ある。

 

5. makeではマクロを定義するが、例えば環境変数コマンドライン上で定義した

 マクロ、内部マクロなどの優先順位はどうなのだろうか。

 大まかに分けると次のようになるらしい。(1が優先順位が高い)

 

 1. コマンドライン上でmakeよりも後に定義されたマクロ。(4参照)

 2. makefile内で定義されたマクロ。

 3. 環境変数

 4. makeであらかじめ内部定義されているマクロ。

 

 ただ、環境変数makefile内の定義よりも優先した以上ができたとする。

 その時は-eオプションを付けると上記の2番と3番の優先順位が入れ替わる。

 

6. マクロの中の一部の文字列だけを置換したくなったとする。

 例えば、~.cを大量に並べていたが、それぞれのオブジェクトファイル~.oも

 マクロとして使用したくなった時などだ。

 この時は、マクロを参照するかっこのなかに少し技巧を凝らす。

 SRC=src1.c src2.c というマクロがあったとすると、$(SRC:.c=.o)と参照することで

 src1.o src2.oと置き換わる。

 もし.c丸ごとなくしたいならば=の後には何も書かなければいい。

 ただし、このような置換は文字列の最後の直前もしくは、空白の直前のみ行われる。

 

7. 便利な自動定義マクロ。

 $@は現在処理中のターゲット、つまり : の左のファイルを表す。

 $?はコンポーネントリスト、つまり : の右側のファイルのリストのうち、

 ターゲットよりも新しいものをすべて表す。

 しかし、$?については注意が必要である。gccという有名なコンパイラドライバに

 オブジェクトファイルを指定するとき、$?を用いると痛い目にあうことがある。

 gccはリンクするファイルをすべて同時に指定しなければならないからである。

 また、これらはコマンド行でのみ有効なマクロである。

 $$@というものもある。先ほどの$@との違いは依存関係行、つまり : の行でのみ

 使えるということである。

 target : src1.c $$@.c とすると$$@はtargetであるから$$@はtarget.cとなる。

 

8. サフィックスルールというものがある。有名なものを挙げておく。

 src.oがコンポーネントとして必要なターゲットがあったとする。

 しかし、src.oは存在しなかった。

 このとき、makeは次のようにしてsrc.oを作り出そうとする。

 まず、src.oに関する依存関係の行がないか探す。なかったら次のようにする。

 1-src+サフィックスのファイル名をもつファイルがある。

 2-makeにとって意味のあるサフィックスを持っている。(.c .s .fなど)

 3-定義されているサフィックスルールでsrc.oを作ることができる。

 この三つを満たすファイルをカレントディレクトリから見つけだし、

 あらかじめ定義されたサフィックスルールにのっとって処理する。

 また、サフィックスルールの中では$?の代わりに$<を使う(重要!)

 $*というマクロもある。これもサフィックスルールでのみ有効であり、

 コンポーネントのファイル名のサフィックスを除いた文字列に置き換わる。

 実際のサフィックスルールの書き方については別ページにまとめておく。