Wie schreibe ich make menuconfig, um die Konfiguration des Linux-Kernel-Builds zu automatisieren?


10

Ich möchte einen Linux-Build automatisieren, komme aber irgendwann zu einem Punkt, an dem ich einen scheinbar sehr manuellen Schritt ausführen muss : make menuconfig. Dies scheint Konfigurationen zwischen dem Betriebssystem und Kernel-Konfigurationen zu synchronisieren?

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

Wie kann ich den Aufruf make menuconfigfür ein Build-Skript entfernen ?

Abgesehen davon ist dies eine Reaktion auf einen Build-Fehler, der anscheinend auftritt, wenn ich make aufführe, ohne jemals make menuconfig aufzurufen:

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

Es scheint eine fehlende Regel in einem Makefile zu geben, möglicherweise weil das Makefile selbst NICHT existiert oder das Makefile nicht generiert / verwandelt wurde, um diese Regel zu enthalten, aber das ist eine separate Frage.

Es könnte einen klügeren Weg geben, dies alles zusammen anzugehen. Gibt es andere Konfigurationen, die ich nicht verfolge, aber sollte (z. B. oldconfig)?


1
Hast du getestet make olddefconfig?
Jimmyij

Nein, jetzt mehr darüber zu lesen ... es ist einfach so schmerzhaft, weil jedes kleine Experiment so lange dauert.
Tarabyte

Antworten:


8

Das Linux-Kernel-Build-System bietet viele Build-Ziele. Der beste Weg, dies zu erfahren, ist wahrscheinlich 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

Wie Jimij in den Kommentaren sagt, sind die interessanten Teile in den oldconfigverwandten Zielen.

Persönlich würde ich Ihnen empfehlen, sich zu entscheiden silentoldconfig(wenn sich nichts an der .configDatei geändert hat oder olddefconfigwenn Sie Ihre .configDatei mit einem neuen Kernel aktualisiert haben .


1
randconfigüberraschte mich. Vermutlich zum Testen von Builds durch Generieren unwahrscheinlicher Kombinationen verwendet?
Conorsch

2
Ja, dies wird genau als Fuzzer für die Konfigurationsdatei verwendet. Siehe diese Frage: Was ist der Zweck beim Kompilieren des Linux-Kernels make randconfig? (auf der 'Ask Ubuntu'-Website).
Perror

2

merge_config.sh Konfigurationsfragmente

$ 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

Prozess Substitution ist nicht funktioniert leider:

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

wegen: /unix//a/164109/32558

merge_config.shist ein einfaches Frontend für das make alldefconfigZiel.

Beim Cross-Compilieren ARCHmuss beim Ausführen exportiert werden merge_config.sh, zB:

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

Die zusammengeführte Ausgabedatei kann explizit mit der KCONFIG_CONFIGUmgebungsvariablen angegeben werden. sonst überschreibt es nur .config:

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

Buildroot automatisiert es mit BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

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


0

Ich hatte das gleiche Problem, da ich meinen CentOS-Kernel aktualisieren wollte und dies auf mehreren Computern tun musste. Angenommen, mein neuer CentOS-Kernelbaum befindet sich in /linux-5.1 (ich bin im Root-Konto angemeldet).

  1. cd /linux-5.1
  2. Führen Sie make menuconfigIhre Änderungen aus und speichern Sie sie unter.config
  3. Kopieren Sie die /linux-5.1/.configDatei auf Ihren Entwicklungsserver
  4. Damit Ihr nächster Computer aktualisiert werden kann, kopieren Sie die .configDatei von Ihrem Entwicklungsserver /linux-5.1/.configauf den neuen Computer.

Hoffe, das hilft jemandem in der gleichen Situation.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.