关于OpenWrt metadata.pl脚本文件中的几个函数说明_part1

-->>gen_kconfig_overrides()

metadata.pl ---->> gen_kconfig_overrides()

查看metadata.pl脚本,查看parse_command(),发现有以下几种用法:

                   /^target_config$/ and returngen_target_config();

                   /^package_mk$/ and returngen_package_mk();

                   /^package_config$/ and returngen_package_config();

                   /^kconfig/ and returngen_kconfig_overrides();

                   /^package_source$/ and returngen_package_source();

 

我这里主要关注的是以kconfig开头的参数数组;

通过执行make V=s,可以看到其中有这样一条语句:

scripts/metadata.plkconfig /tmp/.packageinfo .config > /build_dir/linux-ipq806x/linux-3.4.0/.config.override

上述语句以/tmp/.packageinfo 和 .config 两个文件作为输入源,最终生成目标是/build_dir/linux-ipq806x/linux-3.4.0/.config.override

 

现在我要追寻的答案是:根据.config中选取的CONFIG_PACKAGE_*=y的PACKAGE,其对应的depends中+kmod-*下面的内核配置选项是否在.config.override中全部进行了设置?

 

那就要看一下gen_kconfig_overrides()这个函数了。

subgen_kconfig_overrides() {

         my %config;

         my %kconfig;

         my $package;

         my $pkginfo = shift @ARGV;

         my $cfgfile = shift @ARGV;

 

         # parameter 2: build system config

         open FILE, "<$cfgfile" orreturn;

         while () {

                   /^(CONFIG_.+?)=(.+)$/ and$config{$1} = 1;

         }

         close FILE;

 

         # parameter 1: package metadata

         open FILE, "<$pkginfo" orreturn;

         while () {

                   /^Package:\s*(.+?)\s*$/ and$package = $1;

                   /^Kernel-Config:\s*(.+?)\s*$/and do {

                            my @config = split/\s+/, $1;

                            foreach my $config(@config) {

                                     my $val ='m';

                                     my$override;

                                     if ($config=~ /^(.+?)=(.+)$/) {

                                               $config= $1;

                                               $override= 1;

                                               $val= $2;

                                     }

                                     if($config{"CONFIG_PACKAGE_$package"} and ($config ne 'n')) {

                                               nextif $kconfig{$config} eq 'y';

                                               $kconfig{$config}= $val;

                                     } elsif(!$override) {

                                               $kconfig{$config}or $kconfig{$config} = 'n';

                                     }

                            }

                   };

         };

         close FILE;

 

         foreach my $kconfig (sort keys%kconfig) {

                   if ($kconfig{$kconfig} eq'n') {

                            print "#$kconfig is not set\n";

                   } else {

                            print"$kconfig=$kconfig{$kconfig}\n";

                   }

         }

}

该函数明显分为4个小部分;

第一个部分:

my %config; 应该是声明了hash数组,也可以说关联数组,更好理解,一个键紧跟一个值组成的列表,如%fred=(one, “zmd”, two, “cxm”), $fred{one}=”zmd”;

my$package; 声明了一个package变量;

my $pkginfo= shift @ARGV;

@ARGV是当前运行的命令行参数列表;

shift是把数组的第一个元素移出并返回它,然后把数组长度减1,并顺移剩下的元素。如果不再存在元素,返回undef。

所以,package为第一个参数,cfgfile为第一个参数,即$packge=/tmp/.packageinfo,$cfgfile=.config。

 

第二个部分:

         open FILE, "<$cfgfile" orreturn;

         while () {

                   /^(CONFIG_.+?)=(.+)$/ and$config{$1} = 1;

         }

         close FILE;

打开文件$cfgfile,即.config文件,且.config文件必须存在,否则直接返回。

读取.config文件的每一行,判断是否以CONFIG_开头,CONFIG_后的“.+”表示匹配1次或多次的任何字符,“(.+)$”表示结尾,即提取每行的“CONFIG_*=*”选项,后面的$1表示“CONFIG_.+?)”。

注意:Perl的正则表达式中如果出现(),则发生匹配或替换后,()内的模式被Perl解释器自动依次赋给系统$1,$2,……

然后对$config数组进行设置,$1即CONFIG_作为数组键,值为1

 

 

第三个部分:

         openFILE, "<$pkginfo" or return;

         while() {

                   /^Package:\s*

你可能感兴趣的:(Openwrt,Openwrt,metadata)