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

问题描述 投票:0回答:5

我遇到过这样的情况:我们的软件需要与多个不同的 Linux 内核发行版/内核树一起工作。 (包括 Android 分支)

在尝试自动化我们的构建过程时,我发现我们需要支持的特定构建的一些

defconfig
文件不包含我们依赖的内核模块。

例如,假设我的

XXX
中需要一个名为
.config
的选项。对于某些依赖项,我可以这样做:

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

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

.config
语句。

是否有更受支持的方法来以非交互方式执行此操作,或者我是否一直在编写更复杂的搜索和替换脚本?

linux build linux-kernel
5个回答
17
投票

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

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

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


7
投票

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
实现自动化:

如何在 Buildroot 中配置 Linux 内核?



相关:https://unix.stackexchange.com/questions/19905/how-to-non-interactively-configure-the-linux-kernel-build

提前 20 天迁移:-)

是的,某些配置选项会在版本之间更改名称,有时作为微妙语义变化的指示。

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

希望有帮助!
    

在更新任何和所有配置依赖项时对单个配置进行一系列简单的翻转:

5
投票
单一选项方法

./scripts/config --set-val CONFIG_OPTION y ./scripts/config --enable CONFIG_BRIDGE ./scripts/config --enable CONFIG_MODULES ./scripts/config --disable CONFIG_X25 ./scripts/config --module CONFIG_NFT make oldconfig (updates dependencies; may prompt with new dependencies, but old deps silently goes away)

多文件合并方法
如果您有几个

.config-*

文件的小片段,想要有选择地合并到主

.config

文件中,请执行:
# Merge IP fragment CONFIG_ settings into the main .config file
./scripts/kconfig/merge_config.sh .config .config-fragment
# Merge  Notebook HW-specific CONFIG_ settings into main .config file
./scripts/kconfig/merge_config.sh .config .config-notebook-toshiba

# Auto-add/auto-remove CONFIG_ dependencies
make oldconfig

参考文献

https://www.kernel.org/doc/html/latest/kbuild/kconfig.html#nconfig-mode
  • https://stackoverflow.com/questions/27090431/linux-kconfig-command-line-interface/70728869#70728869
cat .config-fragment >> .config && make oldconfig

0
投票
与aarch64跨链:
cat .config-fragment >> .config && ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make oldconfig


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.