Як скрипт зробити 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для сценарію складання?

Як осторонь, це є реакцією на помилку побудови, яка, здається, трапляється, коли я запускаюсь, не забуваючи ніколи зробити menuconfig:

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

Здається, у файлі makefile відсутнє правило, можливо тому, що сам makefile НЕ існує або makefile не був створений / перероблений, щоб містити це правило, але це окреме питання.

Може бути розумніший спосіб підходити до цього взагалі. Чи є інші конфігурації, які я не відстежую, але повинні (наприклад, oldconfig)?


1
Ви протестували make olddefconfig?
jimmij

ні, читати більше про це зараз ... це просто так боляче, тому що будь-який невеликий експеримент займає так багато часу.
тарабайт

Відповіді:


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файл новим ядром).


1
randconfigмене здивувало. Імовірно, використовується для тестування збірок шляхом створення малоймовірних комбінацій?
conorsch

2
Так, це точно використовується як фазер для файлу конфігурації. Дивіться це запитання: Яка мета при складанні Linux Kernel make randconfig? (на веб-сайті "Запитати Ubuntu").
перор

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 (я увійшов до кореневого облікового запису)

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

Сподіваюся, що це допомагає комусь із тих самих проблем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.