我的目标是使用命令行更改 kbuild 配置而不弄乱依赖关系。
为此,我通过使用
.config
编辑默认的 make menuconfig
创建了一个“参考”配置。我“唯一”改变的是从 64 位更改为 32 位。
现在我采用了原始配置并应用了以下命令(从 Linux 内核根目录)
scripts/kconfig/merge_config.sh original.conf 32bit.conf
32bit.conf
的内容就是CONFIG_64=n
。
将两个
.config
与 make menuconfig
和我的命令进行比较后,我发现 make menuconfig
的几乎所有更改也存在于另一个文件中。但只有几乎每次改变。
$ diff .config.mkmenuconfig .config.command
104d103
< # CONFIG_NO_HZ_FULL is not set
112d110
< # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set
327d324
< # CONFIG_MPSC is not set
330d326
< # CONFIG_GENERIC_CPU is not set
345c341,342
< # CONFIG_HPET_TIMER is not set
---
> CONFIG_HPET_TIMER=y
> CONFIG_HPET_EMULATE_RTC=y
这些差异在哪里?有没有通过命令行操作 kbuild
.config
的官方方法?
从 5.2+ Linux 内核开始,CONFIG 可以接收第二个文件
.config
并将它们自动合并到最终的 .config
。
但首先,关于配置文件差异的稍微相关的说明,为了显示旧的
.config
与 Linux 内核新发布的内容之间的差异,请执行:
make listnewconfig
(outputs a list of CONFIG_* that are newly added over old .config)
使用 '
KCONFIG_DEFCONFIG_LIST
' shell 定义由 make
实用程序读取,其中包含文件列表,每个文件以空格分隔。
config.network
将与 Linux 内核的 Makefile
位于同一目录中。
CONFIG_BRIDGE=y
CONFIG_ARP=y
CONFIG_IP=y
CONFIG_IP6=y
和
config.notebook-toshiba
可能有
CONFIG_SCSI=y
CONFIG_AHCI=y
CONFIG_RTC_INTF_DEV=y
然后执行:
KCONFIG_DEFCONFIG_LIST="config.network config.notebook-toshiba" make bzImage modules
(部分基于 Rob Landley 发来的 lkml 电子邮件,回复:miniconfig)
allyesconfig
/allmodconfig
/allnoconfig
/randconfig
变体还可以使用环境变量KCONFIG_ALLCONFIG
作为包含用户需要设置为特定值的配置符号的标志或文件名。
如果使用
KCONFIG_ALLCONFIG
时没有使用文件名(其中 KCONFIG_ALLCONFIG == “”
或 KCONFIG_ALLCONFIG == “1”
),则 make *config 检查名为“all{yes/mod/no/def/random}.config
”的文件(对应于所使用的 *config 命令)以查找要使用的符号值。被迫。
如果未找到此文件,它将检查名为“all.config”的文件是否包含强制值。
这使您能够创建“微型”配置 (
miniconfig
) 或仅包含您感兴趣的配置符号的自定义配置文件。然后内核配置系统生成完整的 .config
文件,包括您的 miniconfig 文件的符号。
这个“
KCONFIG_ALLCONFIG
”文件是一个配置文件,其中包含(通常是所有预设配置符号的子集)。这些变量设置仍需接受正常的依赖性检查。
示例:
KCONFIG_ALLCONFIG=custom-notebook.config make allnoconfig
或:
KCONFIG_ALLCONFIG=mini.config make allnoconfig
或:
make KCONFIG_ALLCONFIG=mini.config allnoconfig
这些示例将禁用大多数选项 (allnoconfig),但启用或禁用指定迷你配置文件中明确列出的选项。