
Я знаю назначение этого 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
Более подробную информацию вы найдете вдокументация ядра.