Pliki makra jądra Linux używają frameworka Kbuild. Chociaż są one interpretowane przez GNU make, Kbuild składa się z dużego zestawu makr o szczególnych konwencjach użytkowania, więc typowe wytyczne makefile nie mają zastosowania. Zaletą Kbuild jest to, że potrzebujesz bardzo małej płyty grzewczej, biorąc pod uwagę złożoność zadania.
Kbuild jest udokumentowany w źródle jądra, w Documentation/kbuild. Jako twórca modułów powinieneś szczególnie czytać modules.txt(i przynajmniej przeglądać inne).
To, co teraz robisz, nie działa, ponieważ $(shell pwd)jest rozszerzane, gdy EXTRA_CFLAGSużywana jest zmienna. Ponieważ plik makefile jest uruchamiany z drzewa źródeł jądra, a nie z katalogu modułu (jest to jeden z wielu nieoczywistych aspektów Kbuilda), wybiera niewłaściwy katalog.
Oficjalny idiom określający dołączanie katalogów do modułu nienależącego do drzewa znajduje się w § 5.3 z modules.txt. srcZmienna jest ustawiona na katalogiem głównym twojego modułu. W związku z tym:
EXTRA_CFLAGS := -I$(src)/src/inc
Zauważ, że ta deklaracja powinna znajdować się w pliku wywoływanym Kbuildw katalogu głównym drzewa modułów. (Możesz uznać srckatalog za katalog główny drzewa modułów; jeśli tak, umieść Kbuildtam i zastąp powyższą wartość przez -I$(src)/inc). Możliwe jest również umieszczenie ich w Makefile, ale należy pamiętać, że ta definicja (o ile cokolwiek innego, co ma zastosowanie tylko podczas budowania modułu jądra) powinna być objęta dyrektywą warunkową ifeq ($(KERNELRELEASE),). Patrz § 4.1 z modules.txt.
Jeśli nie masz jeszcze Kbuildpliku i chcesz przejść do jego posiadania, przeczytaj §4.1 modules.txt. Posiadanie osobnego Kbuildpliku jest nieco wyraźniejsze. Nie umieszczaj niczego, co dotyczy jądra w głównym pliku makefile, poza regułą do wywołania make -C $(KERNELDIR) M=$(pwd). W Kbuildminimum potrzebna jest lista modułów, które budujesz (często tylko jeden) i lista plików, które chcesz dołączyć do modułu, a także deklaracja zależności:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h