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
Tradycyjnie sposobem na
#include
pliki ze ścieżkami względem katalogu bieżącego kodu źródłowego jest użycie cudzysłowów zamiast nawiasów kątowych:W tym przypadku pierwszy
#include
będzie odwoływał się do ścieżki przeszukiwania kompilatora (która w przypadku gcc jest kontrolowana przez-I
przełącznik wiersza poleceń), podczas gdy drugi będzie szukał katalogu zawierającego plik źródłowy z#include
.Takie ścieżki też mogą być względne. Więc w src / mod / mymod.c możesz powiedzieć:
i powinno „po prostu działać”.
Nie wiem, czy jest to powszechna praktyka w drzewie jądra Linuksa, ale z pewnością jest lepsza niż wygrywanie ścieżki włączania, która może mieć dowolną liczbę niezamierzonych efektów ubocznych.
źródło