做openwrt 项目的时候,会将代码上库,当其他人下载的时候,为了简单,我们要想办法只执行一个命令就将所有有关项目的配置自动加载。
而不需要每编译一次就要重新make menuconfig 重新配置一遍。
如果只是单纯的linux内核,直接修改make def_menuconfig就OK了。
但是openwrt 没有这些机制。所以我们就需要想办法做一个我们的默认配置出来。
下面,介绍下方法,其中制做diffconfig的方法是从openwrt wiki上面copy过来的。
首先,我们下载完代码以后,一般都会先更新软件包/scripts/feeds update -a && ./scripts/feeds install
执行完上面以后,下面开始我们的制做之旅:
1.make menuconfig
配置我们要加载的选项。将所有我们需要默认加载的选项全部勾选,然后保存退出。
2.scripts/diffconfig.sh >defconfig
执行此命令,这是将我们刚才配置好的选项,导出到defconfig文件。
这样我们关于openwrt的默认配置文件就做好了。关于如何做kernel的默认配置,后面再讲。
3.这时,我们的defconfig文件就做好了,然后就可以上库了。当再次更新代码的时候,我们只需要执行下面两部。默认配置就可以自动导入了。
导入默认配置:
1.cat defconfig >> .config
2.make defconfig
执行上面这两条命令,默认配置就出现啦。
下面讲一下,如何添加内核的默认配置。
假如上面的方法你已经学会了,那么,你可以直接修改defconfig文件,在里面将你需要自动加载的内核选项,添加进去,并置为y值。
openwrt的.config文件中,关于内核的选项,都是形如:CONFIG_KERNEL_ 它是有关键字kernel的。添加的时候,要注意下这个。就是将你的内核选项,加一个
CONFIG_KERNEL_头.这样就OK了。
上面这种方法是对于内核中已经存在的选项的添加方法。
那么,假如我想添加一个单独的模块,或者是一个单独的控制宏,这时候,我们应该怎么做呢?
下面介绍一下,添加一个单独的控制宏的方法。
其实在.config文件中定义的各个CONFIG_XXXX都是各种预编译宏。那么,假如工程需要,定义一些跟本项目有关的宏时,如何添加到默认配置呢?
我们需要修改两个文件:
1.defconfig
2.根目录下config\Config-kernel.in文件
假如我们需要添加宏CONFIG_KERNEL_ATEL_PCB_S24V
1.在defconfig 中,添加 CONFIG_KERNEL_ATEL_PCB_S24V=y(默认开启此宏)
2.在config\Config-kernel.in中,添加如下语句:
#
# ATEL add support s24v
#
config KERNEL_ATEL_PCB_S24V --标志内核的选项
bool "ATEL GPIO Support" --类型为bool (y/n)
default n --默认为no (但是我们在defconfig中已经修改为yes 啦)
之后,你再执行上现加载命令的时候,宏CONFIG_ATEL_PCB_S24V就成功的添加到了默认配置。
增加模块方法也是一样的,都是用宏来控制的嘛,再把相应的makefile一改就OK啦。
下面介绍一下openwrt的.config和kernel中的.config之间的联系:
Make defconfig之后
会执行scripts/config/conf--defconfig=.config Config.in
Conf(一个可执行程序,源码在scripts\config中)主要是将Config.in中的各个文件夹中的Config.in(Config-build.in Config-devel.in Config-image.in Config-kernel.in)选项全部读取出来,放到一个表中。
然后将.config中的选项逐个的与链表中各值对比。相同,则保存在一个叫作.tmp.xxxx(进程号)的文件中。
当全部比对完成以后,将.config更名为.config.old 将.tmp.xxxx更名为.config
此时openwrt配置选项加载完成.
之后执行kernel的配置选项加载:
scripts/kconfig.pl +generic/config-3.10 mt7620/config-3.10 > .config.target
就是将generic和 mt7620中的config-3.10中的内核选项融合 添加到.config.target文件中
awk'/^(#[[:space:]]+)?CONFIG_KERNEL/{sub("CONFIG_KERNEL_","CONFIG_");print}'trunk/.config >> linux-3.10.14-p112871/.config.target
此处将openwrt.config中有关内核选项去掉KERNEL_关键字后添加到.config.target中去。
metadata.pl kconfig tmp/.packageinfotrunk/.config linux-3.10.14-p112871/.config.override
kconfig.pl 'm+' '+'linux-3.10.14-p112871/.config.target /dev/nulllinux-3.10.14-p112871/.config.override > linux-3.10.14-p112871/.config
mv linux-3.10.14-p112871/.configlinux-3.10.14-p112871/.config.old
grep -v INITRAMFS .config.old > .config