Jak wykonać skrypt, aby menuconfig zautomatyzował konfigurację kompilacji jądra systemu Linux?

10

Chcę zautomatyzować kompilacji Linuksa, ale w końcu dostać się do punktu, w którym trzeba uruchomić, co wydaje się być bardzo instrukcja krok: make menuconfig. To wydaje się synchronizować konfiguracje między systemem operacyjnym a konfiguracjami jądra?

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

Zasadniczo, jak mogę usunąć wezwanie do make menuconfigskryptu kompilacji?

Nawiasem mówiąc, jest to reakcja na błąd kompilacji, który wydaje się występować, gdy uruchamiam się bez wywoływania make menuconfig:

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

Wydaje się, że brakuje w pliku makefile pewnej reguły, być może dlatego, że sam plik makefile NIE istnieje lub plik makefile nie został wygenerowany / przekształcony, aby zawierał tę regułę, ale jest to osobne pytanie.

Może istnieć mądrzejszy sposób na zbliżenie się do tego wszystkiego. Czy są inne konfiguracje, których nie śledzę, ale powinienem (np. Oldconfig)?

tarabajt
źródło
1
Testowałeś make olddefconfig?
jimmij
nie, czytając więcej o tym teraz ... to jest tak bolesne, ponieważ każdy mały eksperyment trwa tak długo.
tarabyte

Odpowiedzi:

8

System kompilacji jądra Linux zapewnia wiele celów kompilacji, najlepszym sposobem, aby się o tym dowiedzieć, jest prawdopodobnie 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

Jak mówi jimmij w komentarzach, interesujące części znajdują się w oldconfigpowiązanych celach.

Osobiście polecam Ci przejść silentoldconfig(jeśli nic nie zmieniło się w .configpliku lub olddefconfigjeśli zaktualizowałeś .configplik za pomocą nowego jądra).

perror
źródło
1
randconfigzaskoczyło mnie. Prawdopodobnie używany do testowania kompilacji przez generowanie nieprawdopodobnych kombinacji?
conorsch,
2
Tak, jest to dokładnie używane jako fuzzer dla pliku konfiguracyjnego. Zobacz to pytanie: Jaki jest cel kompilacji jądra Linux make randconfig? (na stronie internetowej „Zapytaj Ubuntu”).
perror
2

merge_config.sh fragmenty konfiguracji

$ 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

Proces zastępowania nie działa niestety:

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

z powodu: https://unix.stackexchange.com/a/164109/32558

merge_config.shto prosty interfejs dla make alldefconfigcelu.

Podczas kompilacji krzyżowej ARCHnależy go wyeksportować po uruchomieniu merge_config.sh, np .:

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

Scalony plik wyjściowy można jawnie określić za pomocą KCONFIG_CONFIGzmiennej środowiskowej; w przeciwnym razie po prostu nadpisze .config:

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

Buildroot automatyzuje to za pomocą BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

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

Ciro Santilli
źródło
0

Miałem ten sam problem, ponieważ chciałem zaktualizować jądro CentOS i musiałem to zrobić na kilku komputerach. Załóżmy, że moje nowe drzewo jądra CentOS znajduje się w /linux-5.1 (jestem zalogowany do konta root)

  1. cd /linux-5.1
  2. uruchom make menuconfigi wprowadź zmiany i zapisz je w.config
  3. skopiuj /linux-5.1/.configplik na serwer programistyczny
  4. Teraz do aktualizacji na następnej maszynie skopiujesz .configplik z serwera /linux-5.1/.configprogramistycznego na nowy komputer.

Mam nadzieję, że to pomoże komuś w takiej samej sytuacji.

schmiddy
źródło