Como fazer o script menuconfig para automatizar a configuração de compilação do kernel do Linux?

6

Eu quero automatizar uma compilação do Linux, mas eventualmente chegar a um ponto em que preciso executar o que parece ser uma etapa muito manual: make menuconfig . Isso parece sincronizar as configurações entre o sistema operacional e as configurações do kernel?

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

Basicamente, como posso remover a chamada para make menuconfig para um script de compilação?

Como um aparte, isso é uma reação a um erro de compilação que parece acontecer quando eu corro sem chamar menuconfig:

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

O que parece ser uma regra ausente em um makefile talvez porque o makefile em si NÃO existe ou o makefile não foi gerado / modificado para conter essa regra, mas essa é uma questão separada.

Poderia haver uma maneira mais inteligente de abordar tudo isso. Existem outras configurações que eu não estou acompanhando, mas deveria (por exemplo, oldconfig)?

    
por tarabyte 23.08.2015 / 06:13

2 respostas

5

O sistema de compilação do kernel Linux fornece muitos destinos de compilação, a melhor maneira de saber sobre isso é provavelmente fazer um 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

Como jimmij diz nos comentários, as partes interessantes estão nos alvos relacionados com oldconfig .

Pessoalmente, recomendo que você escolha silentoldconfig (se nada tiver sido alterado no arquivo .config ou olddefconfig se você tiver atualizado o arquivo .config com um novo kernel.

    
por 23.08.2015 / 08:20
1

merge_config.sh fragmentos de configuração

$ 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

A substituição de processos não não funciona, infelizmente:

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

devido a: link

merge_config.sh é um front-end simples para a meta make alldefconfig .

Ao fazer a compilação cruzada, ARCH deve ser exportado quando você executar merge_config.sh , por exemplo:

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

O arquivo de saída mesclado pode ser especificado explicitamente com a variável de ambiente KCONFIG_CONFIG ; caso contrário, apenas sobrescreve .config :

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

O Buildroot automatiza-o com BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES : link

Relacionado: link

    
por 18.06.2018 / 11:59