Ответ 1
мотивация
.config
не просто копируется из вашего файла defconfig
. Мотивация для хранения defconfig
в таком формате следующая: в defconfig
мы можем указывать только параметры со значениями не по умолчанию (т.е. параметры, которые мы изменили для нашей платы). Таким образом, мы можем сохранить его маленьким и ясным. Каждая новая версия ядра приносит кучу новых опций, и таким образом нам не нужно обновлять наш файл defconfig
каждый раз, когда ядро выпускает. Также следует отметить, что система сборки ядра хранит очень специфический порядок опций в файле defconfig
, поэтому лучше избегать его изменения вручную. Вместо этого вы должны использовать правило make savedefconfig
.
Упрощенное объяснение
Когда .config
файл .config
, система сборки ядра просматривает все файлы Kconfig
(из всех подкаталогов), проверяя все параметры в этих файлах Kconfig
:
- если параметр указан в
defconfig
, система сборки помещает этот параметр в.config
со значением, выбранным вdefconfig
- если опция не упоминается в
defconfig
, система сборки помещает эту опцию в.config
используя значение по умолчанию, указанное в соответствующемKconfig
Проверьте scripts/kconfig/Makefile и scripts/kconfig/conf.c файлы, чтобы увидеть, как это на самом деле сделано.
Более точное и подробное объяснение
Из "Kbuild: система сборки ядра Linux" Хавьера Мартинеса:
Определение символов конфигурации: файлы
Kconfig
Символы конфигурации определены в файлах, известных как файлы
Kconfig
. Каждый файлKconfig
может описывать произвольное количество символов, а также может включать в себя (источник) другие файлыKconfig
. Цели компиляции, которыеmake menuconfig
меню конфигурации параметров компиляции ядра, такие какmake menuconfig
, читают эти файлы для построения древовидной структуры. Каждый каталог в ядре имеет одинKconfig
который включает файлыKconfig
своих подкаталогов. Вверху каталога исходного кода ядра находится файлKconfig
который является корнем дерева опций.menuconfig
(scripts/kconfig/mconf
),gconfig
(scripts/kconfig/gconf
) и другие цели компиляции вызывают программы, которые запускаются в этом корневомKconfig
и рекурсивно читают файлыKconfig
расположенные в каждом подкаталоге, для создания своих меню. Какой подкаталог для посещения также определяется в каждом файлеKconfig
и также зависит от значений символов конфигурации, выбранных пользователем.Хранение символьных значений: файл
.config
Все значения символов конфигурации сохраняются в специальном файле
.config
. Каждый раз, когда вы хотите изменить конфигурацию компиляции ядра, вы выполняете цель make, такую какmenuconfig
илиxconfig
. Они читают файлыKconfig
для создания меню и обновляют значения символов конфигурации, используя значения, определенные в файле.config
. Кроме того, эти инструменты обновляют файл.config
новыми выбранными вами опциями, а также могут сгенерировать его, если его не было раньше.Поскольку файл
.config
представляет собой простой текст, вы также можете изменить его, не используя какой-либо специализированный инструмент. Это очень удобно для сохранения и восстановления предыдущих конфигураций компиляции ядра.
Полезные команды
Вы можете использовать более простой синтаксис для make defconfig
, например:
$ make ARCH=arm your_board_defconfig
Смотрите полный список доступных defconfigs с:
$ make ARCH=arm help | grep defconfig
Если вам нужно выполнить обратное действие (т.е. создать аккуратный маленький defconfig
из обширного .config
), вы можете использовать правило savedefconfig
:
$ make ARCH=arm savedefconfig
Также, как упомянул 0andriy, вы можете использовать скрипт diffconfig
для просмотра изменений из одного .config
в другой:
$ scripts/diffconfig .config_old .config_new