如何以非交互方式打开Linux内核.config文件中的function?

我有一种情况,我们的软件需要与几个不同的Linux内核发行版/内核树一起工作。 (包括Android分支)

在试图自动化我们的构build过程中,我发现我们需要支持的特定构build的一些defconfig文件不包括我们所依赖的内核模块。

例如,让我们想象我需要一个叫做XXX的选项。 对于一些依赖关系,我可以做这样的事情:

 sed -i 's/# CONFIG_XXX is not set/CONFIG_XXX=m/' .config 

对于其他人来说,这并不是那么容易,因为依赖可能跨越多行.config语句。

有没有一个更支持的方式来做到这一点非交互式,或者我坚持写一个更复杂的search和replace脚本?

是的,一些配置选项会在不同的版本之间更改名称,有时也会表示语义的细微变化。

我写了python类来将一组配置片段合并到基本内核配置文件中。 尽管如此,这对你来说太过分了。 你可以做一个sed脚本一样的东西; 你并不局限于单线。

 sed -ir 's/^(CONFIG_XXX=.*|# CONFIG_XXX is not set)/CONFIG_XXX=m/; s/^(CONFIG_FOO=.*|# CONFIG_FOO is not set)/CONFIG_FOO=m/; s/^(CONFIG_BAR=.*|# CONFIG_BAR is not set)/CONFIG_BAR=m/' .config 

甚至创建一个单独的脚本。 说,config.sed包含行:

 s/^(CONFIG_XXX=.*|# CONFIG_XXX is not set)/CONFIG_XXX=m/; s/^(CONFIG_FOO=.*|# CONFIG_FOO is not set)/CONFIG_FOO=m/; s/^(CONFIG_BAR=.*|# CONFIG_BAR is not set)/CONFIG_BAR=m/; 

那你可以跑了

 sed -ire config.sed .config 

希望有所帮助!

配置碎片

scripts/kconfig/merge_config.sh

用法:

 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

BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES使用BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES自动化: 如何在 BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES 配置Linux内核?

merge_config.shmake alldefconfig目标的简单前端。