做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

就是将genericmt7620中的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

 

原文:https://blog.csdn.net/weiniliuchao/article/details/50295527