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_CFLAGSVariable 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 srcVariable 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 KbuildStammverzeichnis Ihres Modulbaums aufgerufen wird . (Möglicherweise möchten Sie das srcVerzeichnis als das Stammverzeichnis Ihres Modulbaums betrachten. Wenn ja, setzen Sie es Kbuilddort 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 KbuildDatei haben und zu einer wechseln möchten, lesen Sie §4.1 von modules.txt. Eine separate KbuildDatei 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 KbuildMindestanforderung 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