Для файлів ядра 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