Как сделать скрипт make menuconfig для автоматизации конфигурации сборки ядра Linux?

10

Я хочу , чтобы автоматизировать сборку Linux , но в конечном итоге добраться до точки , где мне нужно бежать , что кажется очень ручной шаг: make menuconfig. Это похоже на синхронизацию конфигов между ОС и конфигами ядра?

cp git-tracked-config .config
make defconfig 
make menuconfig # <- how to automate/script this?
make V=s

Как я могу удалить вызов make menuconfigсценария сборки?

Кроме того, это реакция на ошибку сборки, которая возникает, когда я запускаю без вызова make menuconfig:

make[1]: *** No rule to make target `include/config/auto.conf', needed by `include/config/kernel.release'.  Stop.

Кажется, что в make-файле отсутствует правило, возможно, потому что сам make-файл НЕ существует, или make-файл не был сгенерирован / преобразован, чтобы содержать это правило, но это отдельный вопрос.

Там может быть умнее, чтобы подойти к этому вообще. Есть ли другие конфигурации, которые я не отслеживаю, но должен (например, oldconfig)?

tarabyte
источник
1
Вы проверяли make olddefconfig?
Джимми
нет, читать больше об этом сейчас ... это просто так больно, потому что любой маленький эксперимент занимает так много времени.
Тарабайт

Ответы:

8

Система сборки ядра Linux предоставляет множество целей сборки, лучший способ узнать об этом, вероятно, это make help:

Configuration targets:
  config      - Update current config utilising a line-oriented program
  nconfig         - Update current config utilising a ncurses menu based program
  menuconfig      - Update current config utilising a menu based program
  xconfig     - Update current config utilising a QT based front-end
  gconfig     - Update current config utilising a GTK based front-end
  oldconfig   - Update current config utilising a provided .config as base
  localmodconfig  - Update current config disabling modules not loaded
  localyesconfig  - Update current config converting local mods to core
  silentoldconfig - Same as oldconfig, but quietly, additionally update deps
  defconfig   - New config with default from ARCH supplied defconfig
  savedefconfig   - Save current config as ./defconfig (minimal config)
  allnoconfig     - New config where all options are answered with no
  allyesconfig    - New config where all options are accepted with yes
  allmodconfig    - New config selecting modules when possible
  alldefconfig    - New config with all symbols set to default
  randconfig      - New config with random answer to all options
  listnewconfig   - List new options
  olddefconfig    - Same as silentoldconfig but sets new symbols to their default value
  kvmconfig   - Enable additional options for guest kernel support
  tinyconfig      - Configure the tiniest possible kernel

Как говорит Джимми в комментариях, интересные части находятся в oldconfigсвязанных целях.

Лично я бы порекомендовал вам пойти silentoldconfig(если ничего не изменилось в .configфайле или olddefconfigесли вы обновили свой .configфайл с новым ядром.

PError
источник
1
randconfigудивил меня. Предположительно используется для тестирования сборок путем генерации маловероятных комбинаций?
Конорш
2
Да, это точно используется как фаззер для файла конфигурации. Посмотрите на этот вопрос: для чего нужно собирать ядро ​​Linux make randconfig? (на сайте «Спроси Ubuntu»).
perror
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: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

Связанный: /programming/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file

Сиро Сантилли 冠状 病毒 审查 六四 事件 法轮功
источник
0

У меня была такая же проблема, так как я хотел обновить свое ядро ​​CentOS и должен был сделать это на нескольких машинах. Предположим, что мое новое дерево ядра CentOS находится в /linux-5.1 (я вошел в учетную запись root)

  1. cd /linux-5.1
  2. запустить make menuconfigи внести изменения и сохранить их в.config
  3. скопируйте /linux-5.1/.configфайл на сервер разработки
  4. Теперь для обновления следующей машины вы скопируете .configфайл со своего сервера разработки /linux-5.1/.configна новую машину.

Надеюсь, что это помогает кому-то в том же положении.

schmiddy
источник