Каким образом переменная obj-m экспортируется в sub-make? - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь изучить сборку модулей ядра Linux и kbuild, выполнив https://www.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf и прочитав руководство по сборке GNU.

Вот Makefile первого примера, Hello-1, в Руководстве по программированию модуля ядра Linux:

obj-m += hello-1.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

AFAIK, obj-m должен быть прочитан kbuild.Однако, согласно руководству GNU Make, я понимаю, что obj-m не следует экспортировать.

За исключением явного запроса, make export является переменной, только если она изначально определена в среде или установлена ​​накомандной строки, и если его имя состоит только из букв, цифр и подчеркиваний.Некоторые оболочки не могут работать с именами переменных среды, состоящими из символов, отличных от букв, цифр и подчеркиваний.

https://www.gnu.org/software/make/manual/html_node/Variables_002fRecursion.html

obj-m не определено в среде изначально и не заданов командной строке.Поэтому я ожидаю, что он не должен экспортироваться по рецепту цели all.Как kbuild access obj-m?

1 Ответ

0 голосов
/ 07 июня 2018

Ваш 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
...