我有一种情况,我们的软件需要与几个不同的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.sh
是make alldefconfig
目标的简单前端。