Как неинтерактивно включить функции в файле .config ядра Linux? - PullRequest
8 голосов
/ 21 сентября 2011

У меня есть ситуация, когда нашему программному обеспечению необходимо работать с несколькими различными дистрибутивами / деревьями ядра Linux.(включая Android-форки)

Пытаясь автоматизировать наш процесс сборки, я обнаружил, что некоторые из defconfig файлов для определенных сборок, которые мы должны поддерживать, не включают модули ядра, от которых мы зависим.

Например, давайте представим, что мне нужна опция с именем XXX в моем .config.Для некоторых зависимостей я могу сделать что-то вроде этого:

sed -i 's/# CONFIG_XXX is not set/CONFIG_XXX=m/' .config

Для других это не так просто, поскольку зависимость может охватывать несколько строк .config операторов.

Есть ли ещеподдерживаемый способ сделать это не в интерактивном режиме, или я застрял писать более сложный сценарий поиска и замены?

Ответы [ 3 ]

6 голосов
/ 21 сентября 2011

Да, некоторые параметры конфигурации изменяют имена между выпусками, иногда как указание на небольшие семантические изменения.

Я написал классы Python для объединения набора фрагментов конфигурации в базовые файлы конфигурации ядра. Это для тебя излишне; вы можете сделать то же самое, что и сценарий sed; Вы не ограничены однострочником.

sed -ir 's/^(CONFIG_XXX=.*|# CONFIG_XXX is not set)/CONFIG_XXX=m/;
         s/^(CONFIG_FOO=.*|# CONFIG_FOO is not set)/CONFIG_FOO=m/;
         s/^(CONFIG_BAR=.*|# CONFIG_BAR is not set)/CONFIG_BAR=m/' .config

Или даже создать отдельный скрипт. Скажем, config.sed, который содержит строки:

s/^(CONFIG_XXX=.*|# CONFIG_XXX is not set)/CONFIG_XXX=m/;
s/^(CONFIG_FOO=.*|# CONFIG_FOO is not set)/CONFIG_FOO=m/;
s/^(CONFIG_BAR=.*|# CONFIG_BAR is not set)/CONFIG_BAR=m/;

Тогда вы можете запустить

sed -ire config.sed .config

Надеюсь, это поможет!

2 голосов

merge_config.sh фрагменты конфигурации

$ cd linux
$ git checkout v4.9
$ make x86_64_defconfig
$ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]' .config
# CONFIG_DEBUG_INFO is not set
$ # GDB_SCRIPTS depends on CONFIG_DEBUG_INFO in lib/Kconfig.debug.
$ cat <<EOF >.config-fragment
> CONFIG_DEBUG_INFO=y
> CONFIG_GDB_SCRIPTS=y
> EOF
$ # Order is important here. Must be first base config, then fragment.
$ ./scripts/kconfig/merge_config.sh .config .config-fragment
$ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]' .config
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y

Процесс замещения не работает, к сожалению:

./scripts/kconfig/merge_config.sh arch/x86/configs/x86_64_defconfig \
    <( printf 'CONFIG_DEBUG_INFO=y\nCONFIG_GDB_SCRIPTS=y\n' ) 

из-за: https://unix.stackexchange.com/a/164109/32558

merge_config.sh - это простой интерфейс для цели make alldefconfig.

При кросс-компиляции ARCH необходимо экспортировать при запуске merge_config.sh, например ::

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig
./scripts/kconfig/merge_config.sh .config .config-fragment

Объединенный выходной файл может быть указан явно с помощью переменной окружения KCONFIG_CONFIG; в противном случае он просто перезаписывает .config:

KCONFIG_CONFIG=some/path/.config ./scripts/kconfig/merge_config.sh .config .config-fragment

Buildroot автоматизирует его с помощью BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: Как настроить ядро ​​Linux в Buildroot?

Похожие: https://unix.stackexchange.com/questions/19905/how-to-non-interactively-configure-the-linux-kernel-build Перенесены на 20 дней раньше: -)

1 голос
/ 09 июня 2019

В ядре есть инструмент (./scripts/config) для изменения определенных параметров в .config.Вот пример:

./scripts/config --set-val CONFIG_OPTION y

Хотя он не проверяет правильность файла .config.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...