最近、「Linux Kernel Module プログラミングガイド」という本を使ってカーネルモジュールのプログラミングを学び始めましたが、これがどのように機能するのか理解していません。
obj-m += hello-1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
私はmakefileの基本を理解していますが、これは複雑に見えます。少なくとも make clean be rm hello-1.ko?
答え1
以下は、このmakefileで何が起こっているのかを詳しく説明します。
どこかにオブジェクトのリストがあり、「hello-1.o」がリストに追加されます。
obj-m += hello-1.o
要件なしでallというターゲットを作成します。これを行うには、システムが実行されている現在のカーネルバージョンの名前を付けたディレクトリのビルドディレクトリ(/libの下のモジュールディレクトリにあります)に変更することです。変数を保存すると、変数には make という現在の作業ディレクトリが含まれます。ここで、変更したばかりのディレクトリで make ファイルを見つけて、ターゲットモジュールをビルドします。
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
これはほぼ同じで、読者にとって練習問題として残されます。
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
クリーンが1回以上ある理由rm
は、カーネルにすべて一緒に動作する別の部分がたくさんあるからです。モノリシックなメイクファイルを書くのはせいぜい痛いですが、実際には維持するのは難しいです。したがって、ビルドディレクトリの各論理部分には、調整makefileから呼び出すことができる独自のmakefileがあります。 Makefileは非常に面倒なので、集中してメンテナンスできるようにするのが最善です。