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

10

Quero automatizar uma compilação do Linux, mas finalmente chego 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 make menuconfigpara um script de construção?

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

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

O que parece existir uma regra ausente em um makefile talvez porque o próprio makefile NÃO exista ou o makefile não tenha sido gerado / modificado para conter essa regra, mas essa é uma pergunta separada.

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

tarabyte
fonte
1
Você já testou make olddefconfig?
jimmij
não, ler mais sobre isso agora ... é tão doloroso porque qualquer pequena experiência leva tanto tempo.
tarabyte 23/08/2015

Respostas:

8

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

Pessoalmente, eu recomendaria que você pesquisasse silentoldconfig(se nada mudou no .configarquivo ou olddefconfigse você atualizou seu .configarquivo com um novo kernel.

perror
fonte
1
randconfigme surpreendeu. Presumivelmente usado para testar compilações gerando combinações improváveis?
conorsch
2
Sim, isso é usado com precisão como um difusor para o arquivo de configuração. Veja esta pergunta: Ao compilar o kernel do Linux, qual é o objetivo make randconfig? (no site 'Ask Ubuntu').
perror
2

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

Infelizmente, a substituição do processo não funciona:

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

por causa de: https://unix.stackexchange.com/a/164109/32558

merge_config.shé um front-end simples para o make alldefconfigdestino.

Quando a compilação cruzada, ARCHdeve ser exportada quando você executa 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 KCONFIG_CONFIGvariável de ambiente; caso contrário, apenas substitui .config:

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

O Buildroot o automatiza com BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

Related: /programming/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file

Ciro Santilli adicionou uma nova foto
fonte
0

Eu tive esse mesmo problema, pois queria atualizar meu kernel do CentOS e precisava fazer isso em várias máquinas. Suponha que aqui minha nova árvore do kernel do CentOS esteja em /linux-5.1 (estou logado na conta root)

  1. cd /linux-5.1
  2. execute make menuconfige faça suas alterações e salve-as em.config
  3. copie o /linux-5.1/.configarquivo para seu servidor de desenvolvimento
  4. Agora, para a sua próxima máquina atualizar, você copiará o .configarquivo do servidor de desenvolvimento para /linux-5.1/.configa nova máquina.

Espero que isso ajude alguém na mesma situação.

schmiddy
fonte