Die Linux-Kernel-Makefiles verwenden das Kbuild-Framework. Obwohl diese von GNU make interpretiert werden, besteht Kbuild aus einer großen Menge von Makros mit besonderen Verwendungskonventionen, sodass typische Makefile-Richtlinien nicht gelten. Das Schöne an Kbuild ist, dass Sie angesichts der Komplexität der Aufgabe nur sehr wenig Heizplatte benötigen.
Kbuild ist in der Kernelquelle dokumentiert, in Documentation/kbuild
. Als Modulschreiber sollten Sie besonders lesen modules.txt
(und zumindest die anderen überfliegen).
Was Sie jetzt tun, funktioniert nicht, da $(shell pwd)
es erweitert wird, wenn die EXTRA_CFLAGS
Variable verwendet wird. Da das Makefile nicht aus dem Verzeichnis Ihres Moduls, sondern aus dem Kernelquellbaum ausgeführt wird (dies ist einer der vielen nicht offensichtlichen Aspekte von Kbuild), wird das falsche Verzeichnis ausgewählt.
Das offizielle Idiom für die Angabe von Include-Verzeichnissen in einem Out-of-Tree-Modul ist in §5.3 von modules.txt
. Die src
Variable wird auf das oberste Verzeichnis Ihres Moduls gesetzt. Deshalb:
EXTRA_CFLAGS := -I$(src)/src/inc
Beachten Sie, dass sich diese Deklaration in einer Datei befinden sollte, die im Kbuild
Stammverzeichnis Ihres Modulbaums aufgerufen wird . (Möglicherweise möchten Sie das src
Verzeichnis als das Stammverzeichnis Ihres Modulbaums betrachten. Wenn ja, setzen Sie es Kbuild
dort ein und ersetzen Sie den obigen Wert durch. -I$(src)/inc
) Es ist auch möglich, sie in a zu setzen Makefile
, aber beachten Sie, dass diese Definition (solange alles andere, was nur beim Erstellen eines Kernelmoduls gilt) in einer bedingten Direktive enthalten sein sollte ifeq ($(KERNELRELEASE),)
. Siehe §4.1 von modules.txt
.
Wenn Sie noch keine Kbuild
Datei haben und zu einer wechseln möchten, lesen Sie §4.1 von modules.txt
. Eine separate Kbuild
Datei ist etwas klarer. Fügen Sie in Ihr Haupt-Makefile nichts ein, was für den Kernel gilt, außer eine Regel, die aufgerufen werden soll make -C $(KERNELDIR) M=$(pwd)
. Als Kbuild
Mindestanforderung benötigen Sie die Liste der von Ihnen erstellten Module (häufig nur eines) und eine Liste der Dateien, die in Ihr Modul aufgenommen werden sollen, sowie eine Abhängigkeitserklärung:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h
Traditionell werden
#include
Dateien mit Pfaden relativ zum aktuellen Quellcodeverzeichnis in Anführungszeichen und nicht in spitzen Klammern angegeben:In diesem Fall
#include
verweist der erste auf den Include-Suchpfad des Compilers (der im Fall von gcc von der-I
Befehlszeilenoption gesteuert wird), während der zweite auf das Verzeichnis verweist , das die Quelldatei mit dem enthält#include
.Solche Pfade können auch relativ sein. In src / mod / mymod.c können Sie also sagen:
und es sollte "einfach funktionieren".
Ich weiß nicht, ob dies im Linux-Kernelbaum üblich ist, aber es ist sicherlich besser, als mit dem Include-Pfad herumzuspielen, der eine beliebige Anzahl von unbeabsichtigten Nebenwirkungen haben könnte.
quelle