Linux カーネル モジュールを学習しているうちに、(これまでのところ 2 つのソースから) Makefile を記述する 2 つの方法を確認できます。最初は次のようなものです:
ifneq ($(KERNELRELEASE),)
obj-m := module.o
else
default:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
endif
後者はそれほど複雑ではありません:
obj-m := module.o
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
どちらのメイクファイルのコンパイルでも、正常にコンパイルされたモジュールが生成されます。私の学習には LDD3 の本が伴いますが、これまでに読んだのは次の本です。
このメイクファイルは、通常のビルドで 2 回読み込まれます。コマンド ラインから makefile を呼び出すと、KERNELRELEASE 変数が設定されていないことがわかります。インストールされたモジュール ディレクトリのシンボリック リンク ビルドがカーネル ビルド ツリーを指すという事実を利用して、カーネル ソース ディレクトリを見つけます。ビルド対象のカーネルを実際に実行していない場合は、コマンド ラインで KERNELDIR= オプションを指定するか、KERNELDIR 環境変数を設定するか、メイクファイルで KERNELDIR を設定する行を書き直すことができます。カーネル ソース ツリーが見つかると、makefile は default: ターゲットを呼び出します。このターゲットは、2 番目の make コマンド (makefile で $(MAKE) としてパラメーター化されている) を実行し、前述のようにカーネル ビルド システムを呼び出します。2 回目の読み込みで、makefile は obj-m を設定します。
メイクファイルが 2 回読み込まれた場合、2 番目のアプローチは再帰につながるはずですよね?