正确地保存编译内核产生的.config文件-使用make savedefconfig
一直以来保存编译内核生成的.config文件都是cp .config arch/arm/configs/xxx_defconfig来保存的。但是这其实是一个错误的方法。原因听我细细道来。
以前一直没有在意过这个问题,直到遇到了make xxx_defconfig生成的.config与原xxx_defconfig有差异并解决后,引发我的对.config保存方式的疑惑。原来在arch/arm/configs/中保存的默认xxx_defconfig文件并不是一个完整的.config文件。其实执行过make xxx_defconfig后产生的.config会比原来的多近2000行配置。这些配置在执行make xxx_defconfig自动添加进去的。
一些通用的内容并不会保存,怎样剔出掉这些在.config通用的内容?内核中提供了make savedefconfig这个命令。
savedefconfig - Save current config as ./defconfig (minimal config)
From: https://www.kernel.org/doc/makehelp.txt
这样做的优点相当多了就,节省空间以至于Linux内核的代码量不会太大,第二对比差异的时候好对比一些。更重要的是这个是一个正统的方式。完整命令:
$ make savedefconfig && mv defconfig arch/arm/configs/xxx_defconfig
以下是make xxx_defconfig生成的.config与原xxx_defconfig有差异的内容:
1.楼
接到的厂商发的kernel指定的配置文件是xxx_defconfig,仅仅是执行了make xxx_defconfig生成的.config就和xxx_defconfig就有差别。以前没有在意过这个问题,这次从头开发一个内核的时候出现如题的问题。很诡异,我添加自己的配置后还要保存这个.config呢?为什么我还没有添加的任何配置的时候就出现的不同。这点着实让我很不理解。
对比测试方法是使用学习时mini2440开发版本配置mini2440_defconfig也两样会出现这个问题。这些东西是在哪里添加的,我大概推测是Makefile中添加的,但是又不确定,有没有人研究过?
2.楼
以前学习MIni2440的时候都是copy mini2440_defconfig .config来进行生成的.config,使用make mini2440_defconfig原来经历的过程要麻烦的多。如下:
$ make mini2440_defconfig -n make -f scripts/Makefile.build obj=scripts/basic : rm -f .tmp_quiet_recordmcount mkdir -p include/linux include/config make -f scripts/Makefile.build obj=scripts/kconfig mini2440_defconfig set -e; echo ' HOSTLD scripts/kconfig/conf'; gcc -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o ; echo 'cmd_scripts/kconfig/conf := gcc -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o ' > scripts/kconfig/.conf.cmd scripts/kconfig/conf --defconfig=arch/arm/configs/mini2440_defconfig Kconfig $
有点纠结了。使用这种方法还是copy的,以存在就是合理来讲make xxx_defconfig一样是一定的原因的。
3.楼
再来一贴,问题找到了。两种实现结果最终是一样的,以下是验证过程,以mini2440_defconfig为例子。
$ cp arch/arm/configs/mini2440_defconfig .config $ make menuconfig scripts/kconfig/mconf arch/arm/Kconfig # # configuration written to .config # *** End of Linux kernel configuration. *** Execute 'make' to build the kernel or try 'make help'. $ cp .config .config_bak $ make mini2440_defconfig # # configuration written to .config # $ diff .config .config_bak 4c4 < # Thu Sep 25 15:23:14 2014 --- > # Thu Sep 25 15:22:54 2014 $
make xxx_defconfig生成的.config可以直接make zImage,相当于copy mini2440_defconfig .config再执行make menuconfig的效果。