Grundlegendes zu einer Make-Datei zum Erstellen von .ko-Dateien

Grundlegendes zu einer Make-Datei zum Erstellen von .ko-Dateien

Ich kenne den Zweck dieser Make-Datei. Es handelt sich um ein Makefile für einen Treiber, das das Build-System des Kernels aus der Kernel-Quelle aufruft. Aber ich verstehe nicht, was genau passiert.

# 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

Zum Beispiel, was hier passiert:

 `${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

und hier:

obj-m := ofd.o` 

Kann mir jemand mit einigen weiteren Kommentaren dabei helfen, dies zu verstehen?

Ich habe dies hiervon übernommenVerknüpfung.

Mit dieser Make-Datei ist eine .c-Datei (Treiber) verknüpft.

/* 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");

Antwort1

Wie in den Makefile-Kommentaren erklärt, besteht dieses Makefile aus zwei Teilen. Das liegt daran, dass es zweimal gelesen wird. Zuerst, wenn Sie make auf der Befehlszeile aufrufen, dann von 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

Wenn KERNELRELEASEnicht definiert ist, liegt es daran, dass die Datei von make gelesen wird. Sie haben ein Makefile, das make mit der -COption aufruft, das Verzeichnis in das Verzeichnis zu ändern, in dem sich Ihre Kernelquelle befindet.

Make liest dann das Makefile dort (im Kernel-Quellverzeichnis). SUBDIRSDort befindet sich der Quellcode Ihres Moduls. (Ich glaube, SUBDIRSes ist veraltet und Mwird jetzt stattdessen verwendet.)

Das Kernel-Build-System sucht im Verzeichnis Ihres Moduls nach dem Makefile, um zu wissen, was erstellt werden soll. KERNELRELEASEwird festgelegt, sodass dieser Teil verwendet wird:

# Otherwise KERNELRELEASE is defined; we've been invoked from the
# kernel build system and can use its language.
else
    obj-m := ofd.o
endif

Weitere Informationen finden Sie indie Kernel-Dokumentation.

verwandte Informationen