2012年2月13日月曜日

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

LinuxカーネルのMakefileのファイル構成についてざっくり見てみる。


まずトップにある Makefileですが、いろいろなmake変数をセットアップして、exportしています。
exportされた変数は、再帰的に呼び出したmakeにも引き継がれます。
トップのMakefileが行っているトリッキーな処理については「LinuxカーネルのMakefileを解析する その1」「その2」で説明しました。
他にも、トップレベルの構築ルールも書かれています。


それ以外に、共通で使用するmakefileが scripts/ 以下にあります。

scripts/Kbuild.include には共通で使われる便利な変数や関数が入っています。
Kbuild.include は トップのMakefile や scripts/Makefile.* からincludeされています。

scripts/の下には Makefile.* という名前のファイルがあります。
Makefile.build, Makefile.clean, Makefile.fwinst, Makefile.headersinst, Makefile.help, Makefile.modbuiltin, Makefile.modinst, Makefile.modpost
といったファイルです。



これらは、再帰的にmakeを呼び出すときに使わます。
全部の構築ルールを1つのMakefileに書いてしまうと見づらいので、構築するターゲットの種類ごとにサブのMakefileに分離しているわけですね。

これらの使い方は、ほぼ決まっていて、

hoge:
    $(MAKE) -f $(srctree)/scripts/Makefile.build obj=$@

みたいな書き方をします。
hogeを構築するルールは scripts/Makefile.build のようなサブのMakefileに分離されていて、それを再帰的に呼び出します。
その時に、何を作りたいかは obj変数にセットします。

なお、よく使われるものについては、短く書けるように、

build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj

といった変数が用意されています。これを用いれば、上記のものは、

hoge:
    $(MAKE) $(build)=$@

のように非常に短く書くことができます。
この記法はあちこちで多用されています。

同様に、
clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj
hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
modbuiltin := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.modbuiltin obj

あたりは短く書くための便利変数が用意されている模様。


名前は似ているんですが、Makefile.host と Makefile.libは他の Makefile.* と違って、単に他のMakefileから includeされているだけです。

0 件のコメント:

コメントを投稿