Linux内核修改配置与整体MakeFile检查not clean冲突解决方法
背景
最近因为项目需求,需要更改Android平台下Linux底层内核相关配置,但是更改后整体Make后会报错,报错信息为:
通过去MakeFile文件中错误信息判断的对应行查看报错逻辑:
可得知是因为在内核目录下已经存在.config文件,或者在内核目录下存在/include/config路径,如果符合,就会报is not clean错误信息。
但是之前我是通过make menuconfig方法去配置内核,配置完后必定会在内核目录生成.config文件,所以造成了只要配置了内核就无法通过整体Make的情况。
解决办法
通过查阅资料,解决办法如下:
第一步,首先正常修改内核配置,以我的为例:
我使用的平台是64位,所以先加载64位目标平台原本的内核配置,总不能从头配内核,64位平台内核配置文件在以下目录arch/arm64/configs/xxxx64_defconfig
,如果是32位的话,对应文件位置为arch/arm/configs/xxxx32_defconfig.
执行以下命令从上述老的 xxxx_defconfig 文件生成临时使用的 .config 文件:
$ make ARCH=arm64 xxxx64_defconfig
其中 ARCH=arm64 用来指明当前修改的是 64 位配置,如果要修改的是 32 位配置就应该将这个参数指定为 ARCH=arm,后文均以 64 位为例。然后在 menuconfig 菜单中手动选择上我们需要添加的模块。执行以下命令打开配置菜单:
$ make ARCH=arm64 menuconfig
手动选择好要使用的模块,保存并退出后,我们的配置就写入到 .config 文件中了。然后我们再执行下方的命令将配置保存到 defconfig 文件中:
$ make ARCH=arm64 savedefconfig
上方这条命令在成功被执行之后,我们可以在内核的根目录下发现新增了一个名为 defconfig 的文件,这个文件里包含了所有模块的配置。我们只需要将要移植的模块配置添加到 xxxx64_defconfig 文件中就行了,可以使用下方的命令查看要添加的内容:
$ diff -u arch/arm64/configs/xxxx64_defconfig defconfig
最后将上方命令打印出的那部分改动合入到 arch/arm/configs/xxxx64_defconfig 文件中就好了。合入后删除kernel根目录下的.config文件。
注:也可以直接将defconfig移动替换掉旧的配置文件,但要注意备份。
此时,再在工程主目录使用make命令便可以成功编译:
编译成功后可以在生成的out目录下看到之前修改的内核配置:
vim out/target/product/xxxxxxx(对应工程名)/obj/KERNEL_OBJ/merged_kernel_defconfig