
この make ファイルの目的はわかっています。これはドライバーの Makefile であり、カーネル ソースからカーネルのビルド システムを呼び出すものです。しかし、正確に何が起こっているのか理解できません。
# Makefile – makefile of our first driver
# if KERNELRELEASE is not defined, we've been called directly from the command line.
# Invoke the kernel build system.
ifeq (${KERNELRELEASE},)
KERNEL_SOURCE := /usr/src/linux
PWD := $(shell pwd)
default:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules
clean:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
# Otherwise KERNELRELEASE is defined; we've been invoked from the
# kernel build system and can use its language.
else
obj-m := ofd.o
endif
たとえば、ここで何が起こっているか:
`${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules
そしてここ:
obj-m := ofd.o`
誰か、もう少しコメントを書いて、これを理解するのを手伝ってくれませんか?
私はこれをここから取ったリンク。
この make ファイルには関連する .c ファイル (ドライバー) があります。
/* ofd.c – Our First Driver code */
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>
static int __init ofd_init(void) /* Constructor */
{
printk(KERN_INFO "Namaskar: ofd registered");
return 0;
}
static void __exit ofd_exit(void) /* Destructor */
{
printk(KERN_INFO "Alvida: ofd unregistered");
}
module_init(ofd_init);
module_exit(ofd_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <[email protected]>");
MODULE_DESCRIPTION("Our First Driver");
答え1
Makefile のコメントで説明されているように、この Makefile には 2 つの部分があります。これは、この Makefile が 2 回読み込まれるためです。最初はコマンド ラインで make を呼び出すとき、次に kbuild によって読み込まれます。
# if KERNELRELEASE is not defined, we've been called directly from the command line.
# Invoke the kernel build system.
ifeq (${KERNELRELEASE},)
KERNEL_SOURCE := /usr/src/linux
PWD := $(shell pwd)
default:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules
clean:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
が定義されていない場合はKERNELRELEASE
、ファイルが make によって読み取られるためです。-C
カーネル ソースがあるディレクトリに変更するオプションを使用して make を呼び出す Makefile があります。
次に、Make はそこ (カーネル ソース ディレクトリ内) の Makefile を読み取ります。 はモジュールSUBDIRS
ソース コードがある場所です (SUBDIRS
は非推奨で、M
代わりに が使用されるようになったと思います)。
カーネル ビルド システムは、モジュールのディレクトリ内の Makefile を検索して、何をビルドするかを判断します。KERNELRELEASE
が設定されるので、その部分が使用されます。
# Otherwise KERNELRELEASE is defined; we've been invoked from the
# kernel build system and can use its language.
else
obj-m := ofd.o
endif
詳細は以下をご覧くださいカーネルドキュメント。