Linux 内核修改 xxx_defconfig 的正确方法

时间:2023-02-01 00:07:26

【前言】
  昨天将 Android N 上的驱动代码移植到 Android O 上,xxxx_defconfig 文件是我手动修改的,但因为公司将内核版本切换到 4.9 之后开启了强制代码格式检查,所以 Patch 在提交到服务器之后无法通过格式检测,一直提示存在如下问题:

checkpatch found errors or warnings:
$ git log -1 | ./scripts/xxx/merge_pre_check.pl -; total 3 errors.
1: xxxx64_defconfig not generated by savedefconfig
2: xxxx32_defconfig not generated by savedefconfig

  说来惭愧,在之前的项目开发过程中我没有使用过 checkpatch.pl 脚本对代码修改进行过格式检查,这个问题我搞了一整天才搞好。所以这里记录一下。


【检查 Kconfig 文件】
  在最新的内核提交规范中,要求 Kconfig 文件中所有模块的默认配置都设置为 n,并且不允许使用 select 语句。这是为了让使用者必须手动显示地去选择上驱动模块的配置。所以如果我们的老代码中将模块默认配置设置成的 y 或者使用的 select 语句隐式地打开了某些依赖模块的开关,我们都需要在移植过程中进行修改:将 y 改成 n,将 select 改成 depends on,不再使用的菜单或配置项则应该被去掉或注释掉。
  比如我所负责模块里老的 Kconfig 文件写法如下:

menu "Audio Interface"
config XXX_AUDIO
bool "XXX Audio Interface"
default y
select SOUND
select SND_SOC
select SND
select XXX_AUDIO_DSP
select SND_XXX_SOC
select SWITCH
help
"XXX Audio Interface"
endmenu

  将上方的内容按要求进行修改后则是像下方这样:

menu "Audio Interface"
config XXX_AMAUDIO
bool "XXX Audio Interface"
default n
depends on SOUND
depends on SND_SOC
depends on SND
depends on XXX_AUDIO_DSP
#depends on SND_XXX_SOC
#depends on SWITCH
help
"XXX Audio Interface"
endmenu

【修改 defconfig 文件】
  我使用的平台分 32 位和 64位,我们要对这 2 个 defconfig 文件都进行修改。文件分别位于 arch/arm/configs/xxxx32_defconfigarch/arm64/configs/xxxx64_defconfig
  首先执行以下命令从老的 xxxx_defconfig 文件生成临时使用的 .config 文件:

$ make ARCH=arm xxxx32_defconfig

  其中 ARCH=arm 用来指明当前修改的是 32 位配置,如果要修改的是 64 位配置就应该将这个参数指定为 ARCH=arm64后文均以 32 位为例。然后在 menuconfig 菜单中手动选择上我们需要添加的模块。执行以下命令打开配置菜单:

$ make ARCH=arm menuconfig

  手动选择好要使用的模块,保存并退出后,我们的配置就写入到 .config 文件中了。然后我们再执行下方的命令将配置保存到 defconfig 文件中:

$ make ARCH=arm savedefconfig

  上方这条命令在成功被执行之后,我们可以在内核的根目录下发现新增了一个名为 defconfig 的文件,这个文件里包含了所有模块的配置。我们只需要将要移植的模块配置添加到 xxxx32_defconfig 文件中就行了,可以使用下方的命令查看要添加的内容:

$ diff -u arch/arm/configs/xxxx32_defconfig defconfig

  最后将上方命令打印出的那部分改动合入到 arch/arm/configs/xxxx32_defconfig 文件中就好了。
  通过这种方式修改的 defconfig 文件在提交到服务器后就不会再被提示 xxxx32_defconfig not generated by savedefconfig 了。
  关于代码格式的一些更详细的说明,感兴趣的朋友可以阅读《谈谈Linux内核驱动的coding style》