mpo*_*llo 9 linux build linux-kernel
我的情况是我们的软件需要使用几个不同的Linux内核发行版/内核树.(包括Android分叉)
在尝试自动化我们的构建过程时,我发现defconfig我们需要支持的特定构建的一些文件不包括我们依赖的内核模块.
例如,让我们想象一下,我需要一个名为XXXmy 的选项.config.对于某些依赖项,我可以这样做:
sed -i 's/# CONFIG_XXX is not set/CONFIG_XXX=m/' .config
Run Code Online (Sandbox Code Playgroud)
对于其他人来说,这并不容易,因为依赖性可能跨越多行.config语句.
是否有更加支持的方式以非交互方式执行此操作,或者我是否仍在编写更复杂的搜索和替换脚本?
Gus*_*urt 12
内核有一个工具 (./scripts/config) 来更改 .config 上的特定选项。下面是一个例子:
./scripts/config --set-val CONFIG_OPTION y
Run Code Online (Sandbox Code Playgroud)
虽然,它不会检查 .config 文件的有效性。
是的,一些配置选项会在版本之间更改名称,有时会表示细微的语义更改.
我编写了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
Run Code Online (Sandbox Code Playgroud)
甚至可以创建一个单独的脚本.说,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/;
Run Code Online (Sandbox Code Playgroud)
然后你就可以跑了
sed -ire config.sed .config
Run Code Online (Sandbox Code Playgroud)
希望有所帮助!
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
Run Code Online (Sandbox Code Playgroud)
进程替换并没有遗憾的工作:
./scripts/kconfig/merge_config.sh arch/x86/configs/x86_64_defconfig \
<( printf 'CONFIG_DEBUG_INFO=y\nCONFIG_GDB_SCRIPTS=y\n' )
Run Code Online (Sandbox Code Playgroud)
因为: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
Run Code Online (Sandbox Code Playgroud)
可以使用KCONFIG_CONFIG环境变量显式指定合并的输出文件;否则它只会覆盖.config:
KCONFIG_CONFIG=some/path/.config ./scripts/kconfig/merge_config.sh .config .config-fragment
Run Code Online (Sandbox Code Playgroud)
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 天迁移:-)
| 归档时间: |
|
| 查看次数: |
2717 次 |
| 最近记录: |