我想自动化 Linux 构建,但最终我需要运行一个看似非常手动的步骤:make menuconfig
。这似乎同步了操作系统和内核配置之间的配置?
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
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
是目标的简单前端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 (我已登录 root 帐户)
cd /linux-5.1
- 运行
make menuconfig
并进行更改并将其保存到.config
- 将文件复制
/linux-5.1/.config
到您的开发服务器 - 现在,为了升级您的下一台计算机,您需要将
.config
文件从开发服务器复制到/linux-5.1/.config
新计算机上。
希望这可以帮助处于同样困境的人。