Come fare script per creare menuconfig per automatizzare la configurazione della build del kernel Linux?


10

Voglio automatizzare una build Linux ma alla fine arrivare a un punto in cui ho bisogno di correre quello che sembra essere un passo molto manuale: make menuconfig. Questo sembra sincronizzare le configurazioni tra il sistema operativo e le configurazioni del kernel?

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

Fondamentalmente, come posso rimuovere la chiamata a make menuconfigper uno script di build?

A parte questo, questo è in reazione a un errore di build che sembra accadere quando corro senza mai chiamare make menuconfig:

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

Che sembra esserci una regola mancante in un makefile forse perché il makefile stesso NON esiste o il makefile non è stato generato / trasformato per contenere quella regola ma questa è una domanda separata.

Potrebbe esserci un modo più intelligente di avvicinarsi a tutto questo. Ci sono altre configurazioni che non sto monitorando ma che dovrei (ad es. Oldconfig)?


1
Hai provato make olddefconfig?
Jimmij,

no, leggere di più ora ... è così doloroso perché ogni piccolo esperimento impiega così tanto tempo.
Tarabyte,

Risposte:


8

Il sistema di compilazione del kernel Linux fornisce molti target di compilazione, il modo migliore per conoscerlo è probabilmente fare un 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

Come dice jimmij nei commenti, le parti interessanti sono nel oldconfig obiettivi correlati.

Personalmente, ti consiglio di provare silentoldconfig(se non è cambiato nulla nel .configfile o olddefconfigse hai aggiornato il tuo .configfile con un nuovo kernel.


1
randconfigmi ha sorpreso. Presumibilmente utilizzato per testare build generando combinazioni improbabili?
Conorsch,

2
Sì, questo è esattamente usato come fuzzer per il file di configurazione. Vedi questa domanda: durante la compilazione del kernel Linux, a cosa serve make randconfig? (sul sito web "Ask Ubuntu").
perror

2

merge_config.sh frammenti di configurazione

$ 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

Purtroppo la sostituzione del processo non funziona:

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

per colpa di: https://unix.stackexchange.com/a/164109/32558

merge_config.sh è un semplice front-end per make alldefconfig target.

Durante la compilazione incrociata, è ARCHnecessario esportare quando si esegue merge_config.sh, ad esempio:

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

Il file di output unito può essere specificato esplicitamente con la KCONFIG_CONFIGvariabile di ambiente; altrimenti sovrascrive .config:

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

Buildroot lo automatizza con BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

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


0

Ho avuto lo stesso problema poiché volevo aggiornare il mio kernel CentOS e dovevo farlo su più macchine. Supponiamo che il mio nuovo albero del kernel CentOS sia in /linux-5.1 (sono connesso all'account di root)

  1. cd /linux-5.1
  2. esegui make menuconfige apporta le modifiche e salvale in.config
  3. copia il /linux-5.1/.configfile sul tuo server di sviluppo
  4. Ora per l'aggiornamento del tuo prossimo computer copierai il .configfile dal tuo server di sviluppo /linux-5.1/.configsul nuovo computer.

Spero che questo aiuti qualcuno nella stessa situazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.