2012年10月10日水曜日

LinuxカーネルのMakefileを解析する その8

前回からまたまた間があきました。

今回の話題は O= を付けた時の動作についてです。
ソースを見ていて、あれっ、どうやって動いてるんだっけ?という部分がありましたので記載しておきます。

例えば、Kernel のソースツリーで
$ make O=dir/to/store/output/files/ defconfig vmlinux
とやってみると、
ソースツリーを一切汚すことなく、
dir/to/store/output/files/ に出力結果を置いてくれます。

トップの Makefile の動きは 「LinuxカーネルのMakefileを解析する その1」で解説しました。

今回注目するのは script/Makefile.build です。
例えば、*.c から *.o を生成するサフィックスルールを見てみます。

Makefile.build の300行目過ぎにそれがあります。


# Built-in and composite module parts
$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
  $(call cmd,force_checksrc)
  $(call if_changed_rule,cc_o_c)


これは $(src)/%.c から $(obj)/%.o を生成してくれるルールを表しています。

Makefile.build の先頭に
src := $(obj)
がありますので、src と obj は同じディレクトリを指しています。
O= 指定がないときは、それでいいのですが、O= 指定ありの時は、 *.c と違うディレクトリに *.o を作りたいわけです。
obj と src が同じなのに、どうやって動いてるんだろう??としばらく悩みましたが、その答えはトップの Makefile の 150行目過ぎにある

VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))

export srctree objtree VPATH

にあります。

VPATHに $(srctree) が追加されています。

VPATHというのは、make がサフィックスルールにおいて検索するパスを指定するものです。
Cコンパイラでいうところの -I オプションみたいなものといういえばいいでしょうか。

$(obj)/*.o を生成するときに、 $(src)/*.c を探しますが、見つかりません。
次にVPATHで指定されたパスを探しにいき、$(srctree)/$(src)/*.c を使うわけです。

VPATHというのは、私は使わない方がいいと思っている機能なので(どのファイルをコンパイルしているかわかりにくくなる)、うっかり失念しておりました。

0 件のコメント:

コメントを投稿