2013-06-12 5 views
8

При изучении модулей ядра Linux я могу видеть (пока что из двух источников) два способа записи Makefile. Во-первых, что-то вроде:Программирование модуля ядра Linux: makefile

ifneq ($(KERNELRELEASE),) 
     obj-m := module.o 
else 
default: 
     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules 
endif 

последнего является менее сложным:

obj-m := module.o 
all: 
     $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules 

Либо Makefile компиляция приводит к успешно скомпилированный модуль. Мое обучение сопровождается книгой LDD3 и то, что я прочитал до сих пор, это следующий:

Этот make-файл дважды читается на типичной сборке. Когда make-файл вызывается из командной строки, он замечает, что переменная KERNELRELEASE не была установлена. Он находит исходный каталог ядра, используя тот факт, что построение символической ссылки в каталоге установленных модулей указывает на дерево сборки ядра. Если вы на самом деле не используете ядро, для которого вы строите, вы можете указать параметр KERNELDIR = в командной строке , установить переменную окружения KERNELDIR или переписать строку, которая устанавливает KERNELDIR в make-файле. Когда исходное дерево ядра найдено, makefile вызывает объект по умолчанию: target, в котором выполняется вторая команда make (параметризованная в makefile как $ (MAKE)), чтобы вызвать систему сборки ядра, как описано ранее. Во втором чтении make-файлы устанавливают obj-m, а make-файлы ядра заботятся о , фактически создавая модуль.

Если файл makefile читается дважды, то второй подход должен привести к рекурсии, не так ли?

+5

Рекурсия (в этом контексте) определяется как один экземпляр Make, вызывающий другой экземпляр Make. Таким образом, второй подход включает рекурсию. Если вы спрашиваете, приводит ли второй подход к бесконечному циклу, ответ отрицательный, потому что второй экземпляр Make имеет «модули» как цель, а не «все». Отвечает ли это на ваш вопрос? – Beta

+1

Бета, вы должны опубликовать это как ответ, а не комментарий. Я бы поднял тебя. Я бы добавил, что оба подхода используют рекурсию для работы, но первый результат делает несколько более очевидным, что правило «default» или «all» не будет вызываться на втором проходе. –

+0

@Beta, можете ли вы более подробно объяснить, как именно это не приводит к рекурсии внутри make? Возможно, опубликуйте свой ответ, и я поддержу вас ^^. (Наблюдение за исходным кодом файла Makefile kbuild не может довести меня до такой степени, что я могу выяснить внутренности) – mesmerizingr

ответ

3

Когда вы вызываете Makefile в первый раз, набрав #make на консоли, вы не передаете никакой цели. Таким образом, он будет вызывать целевое имя all: в файле makefile по умолчанию.

Внутри цели all: вы передаете цель в качестве модулей. Так, на этот раз она построит модули вместо перехода к all: целям.

И это не будет бесконечным Рекурсия.

Смежные вопросы