Для файлів ядра Linux використовується рамка Kbuild. Хоча вони інтерпретуються GNU make, Kbuild складається з великого набору макросів з особливими умовами використання, тому типові інструкції щодо makefile не застосовуються. Приємне в Kbuild - те, що вам потрібно дуже мало котла, враховуючи складність завдання.
Kbuild задокументовано у джерелі ядра, в Documentation/kbuild
. Як автор модулів, ви повинні особливо читати modules.txt
(і принаймні переглядати інші).
Те, що ви зараз робите, не працює, оскільки $(shell pwd)
розширюється при використанні EXTRA_CFLAGS
змінної. Оскільки makefile запускається з дерева джерела ядра, а не з каталогу вашого модуля (це один із багатьох неочевидних аспектів Kbuild), він підбирає неправильну директорію.
Офіційна ідіома для уточнення включення каталогів у модуль поза деревом міститься в §5.3 modules.txt
. src
Мінлива встановлюється в каталог верхнього рівня вашого модуля. Тому:
EXTRA_CFLAGS := -I$(src)/src/inc
Зауважте, що ця декларація повинна бути у файлі, який називається Kbuild
в корені дерева вашого модуля. (Ви можете вважати, що src
каталог є коренем дерева вашого модуля; якщо так, поставте Kbuild
там і замініть значення вище на -I$(src)/inc
). Можна також поставити їх під застереженням Makefile
, але майте на увазі, що це визначення (якщо все інше, що застосовується лише при побудові модуля ядра), повинно знаходитися в межах умовної директиви ifeq ($(KERNELRELEASE),)
. Дивіться §4.1 від modules.txt
.
Якщо у вас вже немає Kbuild
файлу і хочете перейти на такий, прочитайте §4.1 modules.txt
. Мати окремий Kbuild
файл трохи зрозуміліше. Не ставте нічого, що стосується ядра, у вашому головному makefile, окрім правила для виклику make -C $(KERNELDIR) M=$(pwd)
. У Kbuild
цьому випадку вам потрібен мінімум списку модулів, які ви будуєте (найчастіше лише один) та список файлів, які потрібно включити до вашого модуля, плюс декларація залежності:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h