Comprender un archivo make para crear archivos .ko

Comprender un archivo make para crear archivos .ko

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 KERNELRELEASEno está definido es porque el archivo es leído por make. Tiene un Makefile que llama a make con la -Copción de cambiar el directorio donde está la fuente de su kernel.

Make luego lee el Makefile allí (en el directorio fuente del kernel). SUBDIRSes donde está el código fuente de su módulo. (Creo que SUBDIRSestá en desuso y Mahora 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. KERNELRELEASEse 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.

información relacionada