Makefileと再帰するときのオプションについて(-Cと-fの違い)
再帰する時に -C
を使う場合と -f
を使う場合がある。この時のcwdの扱いが異なる。
説明のために、以下のようなファイル構造でファイルが置かれているとする。
$ tree . . ├── Makefile └── sub └── 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 の場合
$ 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の開始位置との相対パスになってしまうため。