我知道这个 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 有两个部分。那是因为它会被读两次。首先在命令行上调用 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读取的。您有一个 Makefile,它调用 make,并可以-C
选择将目录更改为内核源代码所在的位置。
然后 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
您可以在以下位置找到更多信息内核文档。