依存

ターゲット同士で依存関係を持つことがある。
例えば、Aを生成して、それが出来たらAを利用してBを生成など。

- 自動化のためのGNU Make入門講座 - Makefileの基本:ルール

ターゲット同士の依存関係を見て、処理を切り替えたりできる。

ターゲット: 依存するターゲット
        ターゲットを生成するためのコマンド
依存ターゲット:
        依存ターゲットを生成するためのコマンド

簡単に言うと、最初にターゲットをやるわけだが、依存ターゲットファイルが存在しない場合は、依存ターゲットファイルのルールを先に実行し、その後ターゲットファイルのルールを実行。
存在する場合は、ターゲットファイルのルールだけを実行となる。

Makefileで、

とする。
Makefile以外存在しない場合は、

$ ls
Makefile
$ make
echo "echo ABC" >> first.sh
echo "echo ABC" >> last.sh
echo "echo XYZ" >> last.sh
$ ls
Makefile  first.sh  last.sh
$ cat first.sh
echo ABC
$ cat last.sh
echo ABC
echo XYZ
$

こうなる。
どちらも生成される。
first.sh, last.shのどちらも存在しているなら、

$ make
make: `last.sh' is up to date.
$

こう出る。
last.shの更新が最新かどうかを見てる。
last.shを削除してからmakeすると、

$ rm last.sh
$ ls
Makefile  first.sh
$ make
echo "echo XYZ" >> last.sh
$ ls
Makefile  first.sh  last.sh
$ cat first.sh
echo ABC
$ cat last.sh
echo XYZ
$

こうなる。
last.shの生成は行われるが、first.shは存在するので、first.shの生成処理の時に実行されていた、

echo "echo ABC" >> last.sh

がないために、

$ cat last.sh
echo XYZ
$

こうなっている。
まあ、first.shの生成でlast.shをいじるのはどうかとおもうが。
こういうことがあるので、依存関係は複雑。
ただ、途中までmakeしていると、その分だけmakeは不要となる。
整合性は取れなくなるが。
(なので個人的にall cleanからのmakeがおすすめ。)

Sample/make/target/dependency/src/target at master · bg1bgst333/Sample · GitHub