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.
메이크파일 자체가 존재하지 않거나 메이크파일이 규칙을 포함하도록 생성/변형되지 않았기 때문에 메이크파일에 규칙이 누락된 것 같습니다. 그러나 이는 별도의 문제입니다.
이 문제를 함께 해결하는 더 현명한 방법이 있을 수 있습니다. 추적하고 있지 않지만 추적해야 하는 다른 구성이 있습니까(예: oldconfig)?
답변1
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
답변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.sh
Target의 간단한 프런트 엔드입니다 make 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는 자동화를 위해 다음 명령을 사용합니다 BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES
.https://stackoverflow.com/questions/1414968/how-do-i-configure-the-linux-kernel-within-buildroot
답변3
CentOS 커널을 업그레이드하고 여러 시스템에서 업그레이드해야 했기 때문에 동일한 문제에 직면했습니다. 내 새 CentOS 커널 트리가 /linux-5.1에 있다고 가정해 보겠습니다(저는 루트로 로그인했습니다).
cd /linux-5.1
- 실행
make menuconfig
하고 변경한 다음 저장하세요..config
/linux-5.1/.config
개발 서버에 파일 복사- 이제 다음 컴퓨터를 업그레이드하려면
.config
개발 서버의 파일을/linux-5.1/.config
새 컴퓨터로 복사해야 합니다.
이것이 같은 곤경에 처한 누군가에게 도움이 되기를 바랍니다.