Linux 커널 빌드 구성을 자동화하기 위해 menuconfig를 스크립팅하는 방법은 무엇입니까?


10

Linux 빌드를 자동화하고 싶지만 결국 수동 단계 인 것처럼 보이는 것을 실행 해야하는 시점에 도달합니다 make menuconfig. 이것은 OS와 커널 구성 사이의 구성을 동기화하는 것 같습니다.

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

기본적으로 make menuconfig빌드 스크립트 에 대한 호출을 제거하려면 어떻게 해야합니까?

제쳐두고, 이것은 make menuconfig를 호출하지 않고 실행할 때 발생하는 빌드 오류에 대한 반응입니다.

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

makefile 자체에 존재하지 않거나 makefile이 해당 규칙을 포함하도록 생성 / 모핑되지 않았지만 별도의 질문이기 때문에 makefile에 누락 된 규칙이있는 것 같습니다.

이것에 모두 접근하는 더 똑똑한 방법이있을 수 있습니다. 추적하지 않지만 다른 구성 (예 : oldconfig)이 있습니까?


1
테스트 했습니까 make olddefconfig?
jimmij

아니요, 지금 그것에 대해 더 많이 읽으면 ... 작은 실험에 시간이 오래 걸리기 때문에 너무 고통 스럽습니다.
tarabyte

답변:


8

Linux 커널 빌드 시스템은 많은 빌드 대상을 제공하며, 가장 좋은 방법은 다음을 수행하는 것입니다 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

코멘트에서 jimmij가 말했듯이 흥미로운 부분은 oldconfig관련 목표에 있습니다.

개인적으로, 나는 파일 silentoldconfig에서 아무것도 변경되지 않았 .config거나 새로운 커널로 파일 olddefconfig을 업데이트 한 경우 갈 것을 권장합니다 .config.


1
randconfig나를 놀라게하다. 아마도 조합을 생성하여 빌드를 테스트하는 데 사용됩니까?
conorsch

2
예, 이것은 구성 파일의 퍼저로 정확하게 사용됩니다. 이 질문을보십시오 : Linux 커널을 컴파일 할 때의 목적은 make randconfig무엇입니까? ( 'Ask Ubuntu'웹 사이트).
perror

2

merge_config.sh 구성 조각

$ 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

불행히도 프로세스 대체는 작동 하지 않습니다 .

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

의 이유는 https://unix.stackexchange.com/a/164109/32558

merge_config.shmake alldefconfig대상 의 간단한 프런트 엔드입니다 .

크로스 컴파일 ARCH시 다음을 실행할 때 내 보내야합니다 merge_config.sh. 예 :

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

병합 된 출력 파일은 KCONFIG_CONFIG환경 변수를 사용하여 명시 적으로 지정할 수 있습니다 . 그렇지 않으면 그냥 덮어 씁니다 .config.

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

Buildroot는 /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot로 자동화합니다 BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES.

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


0

CentOS 커널을 업그레이드하고 여러 컴퓨터에서 수행해야했기 때문에 동일한 문제가 발생했습니다. 새 CentOS 커널 트리가 /linux-5.1에 있다고 가정합니다 (루트 계정에 로그인되어 있음)

  1. cd /linux-5.1
  2. 실행 make menuconfig하고 변경하여 저장하십시오..config
  3. /linux-5.1/.config파일을 개발 서버에 복사
  4. 이제 다음 머신을 업그레이드 .config하기 위해 개발 서버 /linux-5.1/.config에서 새 머신으로 파일을 복사 합니다 .

이것이 같은 곤경에 처한 누군가를 돕기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.