Ваш make-файл вызывает submake и передает ему переменную make M
, которая указывает на текущий каталог.Submake вызывается с параметром -C
, так что он запускается так, как если бы он был вызван из указанного каталога, то есть каталога с исходным кодом ядра.Таким образом, используется система сборки ядра со своими собственными make-файлами.Благодаря переменной M
make-файлы ядра знают, где они могут найти ваш make-файл и включают его в свое определение obj-m
.
Примечание: показанный вами make-файл, вероятно, должен быть немного изменен с помощью условий, так что толькоопределение переменной obj-m
видно из системы сборки Linux.Иначе, существует риск столкновения между целями all
и clean
вашего make-файла и целями с одинаковыми именами в make-файлах ядра.И, как отмечает MadScientist, использование make
не очень хорошая идея;$(MAKE)
является предпочтительным.Вы, вероятно, должны использовать что-то вроде:
ifeq ($(KERNELRELEASE),)
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
else
obj-m += hello-1.o
endif