8.1.3 Платформа Makefile в ядре

Предыдущая  Содержание  Следующая V*D*V

Чтобы понять основы Makefile ядра, рассмотрим пример Makefile драйвера. Для этого возьмём drivers/net/Makefile. Сначала рассмотрим Makefile версии 2.4, а затем версии 2.6.

Распечатка 8.1 показывает в упрощённом виде drivers/net/Makefile в Linux 2.4. Первые четыре переменные имеют особое значение. В obj-y находится список объектов, которые непосредственно встраиваются в ядро. В obj-m находится список объектных файлов, которые собираются в виде модулей. Две другие переменные просто игнорируются в процессе сборки.

O_TARGET является целью (то есть результатом работы) для этого Makefile; финальный образ ядра создаётся при сборке всех файлов O_TARGET из с различных подкаталогов. Правила для упаковки всех объектных файлов в этот файл, указанный O_TARGET, определяются $TOPDIR/Rules.make (* TOPDIR является переменной сборки и используется для получения  основного каталога исходных кодов ядра, чтобы сборка не зависела от расположения базового каталога.), который явно включается в Makefile. Файл net.o добавляется в окончательный образ ядра Makefile-ом верхнего уровня.

Специальному объектному файлу, называемому многоэлементным объектом (multipart object), процессом make задано специальное правило. Многоэлементный объект создан с помощью нескольких объектных файлов. Одноэлементый объект не требует специального правила; механизм сборки выбирает исходный файл для сборки, заменяя часть .o целевого объекта на .c. С другой стороны, при сборке многоэлементного объекта должен быть указан список объектов, которые составляют многоэлементный объект. Этот список многоэлементных объектов определяется в переменной list-multi. Для каждого имени, которое появляется в этом списке, эта переменная получается путём добавления строки -objs к имени получаемого списка объектов, необходимого для создания многоэлементного модуля.

Наряду с obj-$(…), ядро версии 2.4 должно с помощью subdir-$(…) указать список подкаталогов для обхода. Снова, то же  самое правило, которое применяется для obj-*, справедливо также для подкаталоги (то есть subdir-y используется для просмотра списка каталогов при сборке образа ядра, в то время как subdir-m используется для обхода при сборке модулей). Наконец, мы подошли к переменной export-objs. Это список файлов, который может экспортировать символы.

Makefile ядра версии 2.6, показанный в Распечатке 8.2, гораздо проще.

Основными отличиями в процедуре сборки версии 2.6 по сравнению с процедурой сборки версии 2.4 являются:

 

Не нужно привлекать Rules.make; правила для сборки экспортируются в неявном виде.

Makefile не указывает имя цели, потому что есть установленный для сборки целевой built-in.o. Чтобы собрать образ ядра, компонуются built-in.o из различных подкаталогов.

Список подкаталогов, которые должны быть посещены, использует ту же переменную obj-* (в отличие от версии 2.4, где используется переменная subdirs-*).

Объекты, которые экспортируют символы, не должны быть упомянуты специальным образом (чтобы узнать эту информацию, процесс сборки использует макрос EXPORT_SYMBOL, встречаемый им в исходном коде).

 

Предыдущая  Содержание  Следующая