
Conozco el propósito de este archivo make; es un Makefile del controlador, que invocaría el sistema de compilación del kernel desde la fuente del kernel. Pero no puedo entender qué está pasando exactamente.
# 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
Por ejemplo lo que está pasando aquí:
`${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules
y aquí:
obj-m := ofd.o`
¿Alguien puede ayudarme a entender esto poniendo algunos comentarios más?
He tomado esto de esteenlace.
Este archivo make tiene un archivo .c asociado (controlador);
/* 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");
Respuesta1
Como se explica en los comentarios de Makefile, este Makefile consta de dos partes. Eso es porque se leerá dos veces. Primero cuando llamas a make en la línea de comando, luego mediante 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
Si KERNELRELEASE
no está definido es porque el archivo es leído por make. Tiene un Makefile que llama a make con la -C
opción de cambiar el directorio donde está la fuente de su kernel.
Make luego lee el Makefile allí (en el directorio fuente del kernel). SUBDIRS
es donde está el código fuente de su módulo. (Creo que SUBDIRS
está en desuso y M
ahora se usa en su lugar).
El sistema de compilación del kernel buscará el Makefile en el directorio de su módulo para saber qué compilar. KERNELRELEASE
se configurará, por lo que se utilizará esa parte:
# Otherwise KERNELRELEASE is defined; we've been invoked from the
# kernel build system and can use its language.
else
obj-m := ofd.o
endif
Encontrarás más información enla documentación del núcleo.