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 件のコメント:
コメントを投稿