I makefile del kernel Linux usano il framework Kbuild. Sebbene questi siano interpretati da GNU make, Kbuild è costituito da un ampio set di macro con particolari convenzioni di utilizzo, quindi non si applicano le linee guida tipiche del makefile. La cosa bella di Kbuild è che hai bisogno di pochissime piastre di cottura considerando la complessità del compito.
Kbuild è documentato nel sorgente del kernel, in Documentation/kbuild
. Come scrittore di moduli, dovresti leggere in particolare modules.txt
(e almeno sfogliare gli altri).
Quello che stai facendo ora non funziona perché $(shell pwd)
viene espanso quando EXTRA_CFLAGS
viene utilizzata la variabile. Poiché il makefile viene eseguito dall'albero dei sorgenti del kernel piuttosto che dalla directory del tuo modulo (questo è uno dei molti aspetti non visibili di Kbuild), sta raccogliendo la directory sbagliata.
Il linguaggio ufficiale per specificare le directory include in un modulo out-of-tree è in §5.3 di modules.txt
. La src
variabile è impostata sulla directory di livello superiore del modulo. Perciò:
EXTRA_CFLAGS := -I$(src)/src/inc
Nota che questa dichiarazione dovrebbe essere in un file chiamato Kbuild
nella radice dell'albero del tuo modulo. (È possibile considerare la src
directory come la radice dell'albero del modulo; in tal caso, inserirla Kbuild
e sostituire il valore sopra con -I$(src)/inc
). È anche possibile metterli in a Makefile
, ma attenzione che questa definizione (purché qualsiasi altra cosa si applichi solo quando si costruisce un modulo kernel) dovrebbe essere all'interno di una direttiva condizionale ifeq ($(KERNELRELEASE),)
. Vedi §4.1 di modules.txt
.
Se non hai Kbuild
già un file e vuoi passare ad averne uno, leggi §4.1 di modules.txt
. Avere un Kbuild
file separato è leggermente più chiaro. Non mettere nulla che si applica al kernel nel tuo makefile principale, tranne una regola da chiamare make -C $(KERNELDIR) M=$(pwd)
. In Kbuild
, il minimo necessario è l'elenco dei moduli che stai costruendo (spesso solo quello) e un elenco di file da includere nel modulo, oltre a una dichiarazione di dipendenza:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h