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

时间:2011-09-21 18:59:27

标签: linux build linux-kernel

我的情况是我们的软件需要使用几个不同的Linux内核发行版/内核树。 (包括Android分叉)

在尝试自动化构建过程时,我发现我们需要支持的特定构建的一些defconfig文件不包含我们依赖的内核模块。

例如,假设我需要在XXX中使用名为.config的选项。对于某些依赖项,我可以这样做:

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

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

是否有更多支持的方式以非交互方式执行此操作,或者我是否仍然无法编写更复杂的搜索和替换脚本?

3 个答案:

答案 0 :(得分:6)

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

我编写了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

希望有所帮助!

答案 1 :(得分: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.shmake 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 How do I configure the Linux kernel within Buildroot?

自动化它

相关:https://unix.stackexchange.com/questions/19905/how-to-non-interactively-configure-the-linux-kernel-build提前20天迁移: - )

答案 2 :(得分:1)

内核有一个工具(./scripts/config)可以更改.config上的特定选项。这是一个示例:

./scripts/config --set-val CONFIG_OPTION y

尽管如此,它不会检查.config文件的有效性。