9

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 番目のアプローチは再帰につながるはずですよね?

4

1 に答える 1