Makefileと再帰するときのオプションについて(-Cと-fの違い)

再帰する時に -C を使う場合と -f を使う場合がある。この時のcwdの扱いが異なる。

説明のために、以下のようなファイル構造でファイルが置かれているとする。

$ tree .
.
├── Makefile
└── sub
    └── Makefile

トップレベルのMakefileの中身は以下のようなもの。

export PWD = $(shell pwd)

withC:
  $(MAKE) -C sub

withF:
  $(MAKE) -f sub/Makefile

subのMakefileは以下のようなもの

default:
   @echo cwd is "`pwd | sed 's@${PWD}@@;'`"

-C の場合

cwd自体が再帰したMakefileのものになる。

$ make withC
make -C sub
cwd is /sub

-f の場合

cwd自体は変わらず、指定されたファイルのタスクが実行される。

$ make withF
make -f sub/Makefile
cwd is 

個人的には

個人的にはサブディレクトリのMakefileを呼ぶときには -C 一択だと思う。例えば、-f を前提にすると以下のようなコードが動かない。

sub/Makefile

default:
   @echo cwd is "`pwd | sed 's@${PWD}@@;'`"
  cat foo
$ echo foo > sub/foo
$ make withF
make -f sub/Makefile
cwd is 
cat foo
cat: foo: No such file or directory
make[1]: *** [default] Error 1
make: *** [withF] Error 2

これは当然で、cwdがトップレベルのmakeが呼ばれた位置なので、サブディレクトリからの相対パスではなく、始端のmakeの開始位置との相対パスになってしまうため。