Make-файлы ядра linux
Документы описывает make-файлы ядра linux.
Обзорная часть
Make-файлы состоят из пяти частей:
Makefile основной make-файл.
.config файл конфигурации ядра.
arch/$(SRCARCH)/Makefile make-файл для архитектуры.
scripts/Makefile.* общие правила и т.д. для всех kbuild make-файлов.
kbuild Makefiles присутствуют в каждой поддиректории.
Основной make-файл считывает файл .config, который получается из процесса конфигурации ядра. Он отвечает за сборку двух основных компонентов: vmlinux (образ резидентного ядра) и модулей (любые файлы модулей). Сборка происходит рекурсивно спускаясь в поддиректории дерева исходно го кода ядра.
Список посещаемых поддиректорий, зависит от конфигурации ядра. Основной make-файл включает в себя текст make-файл архитектуры с именем arch/$(SRCARCH)/Makefile
. Make-файл архитектуры предоставляет основному make-файлу информацию, специфичную для архитектуры.
В каждой поддиректории есть make-файл kbuild, который выполняет команды, переданные сверху. Make-файл kbuild использует информацию из файла .config для создания различных списков файлов, используемых kbuild для построения встроенных или модульных целей.
scripts/Makefile.*
содержит все определения/правила и т. д., которые используются для построения ядра на основе make-файлов kbuild.
Кто что делает
Есть четыре типа людей, взаимодействующих с make-файлами ядра.
-
Пользователи - люди, которые собирают ядра. Эти люди используют команды, такие как
make menuconfig
илиmake
. Обычно они не читают или не редактируют никакие make-файлы ядра (или любые другие исходные файлы). -
Обычные разработчики - люди, которые работают над таким функционалом, как драйверы устройств, файловые системы и сетевые протоколы. Этим людям необходимо поддерживать make-файлы kbuild для подсистемы, над которой они работают. Для эффективной работы им необходимо иметь общее представление о make-файлах ядра, а также подробные знания об общедоступном интерфейсе для kbuild.
-
Разработчики архитектуры - люди, которые работают над целой архитектурой, такой как sparc или x86. Разработчики архитектуры должны знать о make-файле для архитектуры, а также о make-файлах для kbuild.
-
Разработчики kbuild - люди, которые работают над самой системой сборки ядра. Этим людям необходимо знать обо всех аспектах make-файлов ядра.
Эта статья предназначена для обычных разработчиков и разработчиков архитектур.
Файлы kbuild
Большинство make-файлов в ядре это kbuild make-файлы, использующие инфраструктуру kbuild. Эта глава знакомит с синтаксисом, используемым в make-файлах kbuild.
Предпочтительным именем для файлов kbuild является Makefile
, хотя можно использовать и Kbuild
. Если существуют и файл Makefile
и файл Kbuild
, то будет использован файл Kbuild
.
Раздел "Определения целей" - это краткое введение; дальнейшие главы предоставляют более подробные сведения с реальными примерами.
Определения целей
Определение целей является основной частью (сердцем) make-файла для kbuild. Эти строки определяют файлы, которые должны быть собраны, любые особые опции компиляции и любые поддиректории, в которые нужно войти рекурсивно.
Самый простой make-файл для kbuild содержит одну строку:
Пример:
obj-y += foo.o
Это сообщает kbuild, что в этом каталоге есть один объект, с именем foo.o. foo.o будет создан из foo.c или foo.S.
Если foo.o должен быть создан как модуль, используется переменная obj-m. Поэтому часто используется следующий шаблон:
Пример:
obj-$(CONFIG_FOO) += foo.o
$(CONFIG_FOO)
вычисляется как "y" (для встроенного) или "m" (для модуля). Если CONFIG_FOO
не равен ни "y", ни "m", то файл не будет скомпилирован или скомпонован.
Цели: встраиваемые объекты – obj-y
Make-файл kbuild указывает файлы объектов для vmlinux в списках $(obj-y)
. Эти списки зависят от конфигурации ядра.
Kbuild компилирует все файлы $(obj-y)
. Затем он вызывает $(AR) rcSTP
для слияния этих файлов в один файл – built-in.a. Это маленький архив без таблицы символов, который затем будет скомпонован в vmlinux с помощью scripts/link-vmlinux.sh.
Порядок файлов в $(obj-y)
имеет большое значение. Дубликаты в списках допускаются: первой будет скомпонован в built-in.a, а последующие будут проигнорированы.
Порядок компоновки важен, потому что определенные функции (module_init()
/ __initcall
) будут вызваны при загрузке в том порядке, в котором они появляются. Поэтому имейте в виду, что изменение порядка компоновки может, например, изменить порядок обнаружения ваших SCSI-контроллеров и, следовательно, изменить нумерацию ваших дисков.
Пример:
#drivers/isdn/i4l/Makefile
# Make-файл для подсистемы ядра ISDN и драйверов устройств.
# Каждый конфигурационный параметр активирует список файлов.
obj-$(CONFIG_ISDN_I4L) += isdn.o
obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o