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_CFLAGS
uż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
. src
Zmienna 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 Kbuild
w katalogu głównym drzewa modułów. (Możesz uznać src
katalog za katalog główny drzewa modułów; jeśli tak, umieść Kbuild
tam 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 Kbuild
pliku i chcesz przejść do jego posiadania, przeczytaj §4.1 modules.txt
. Posiadanie osobnego Kbuild
pliku 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 Kbuild
minimum 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