-->>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*