diff options
Diffstat (limited to 'v4l/scripts/make_kconfig.pl')
-rwxr-xr-x | v4l/scripts/make_kconfig.pl | 178 |
1 files changed, 165 insertions, 13 deletions
diff --git a/v4l/scripts/make_kconfig.pl b/v4l/scripts/make_kconfig.pl index f612e83db..04430ccf2 100755 --- a/v4l/scripts/make_kconfig.pl +++ b/v4l/scripts/make_kconfig.pl @@ -1,37 +1,189 @@ #!/usr/bin/perl use FileHandle; -my $KDIR=shift; -my $ARCH=shift; +my %depend = (); +my %minver = (); +my %config = (); +my %tristate = (); +my $version, $level, $sublevel; + +my $force_kconfig=shift; + +sub add_bool($) +{ + my $arg=shift; + + $tristate{$arg}="bool"; +# printf "Boolean:%s\n",$arg; +} + +sub add_tristate($) +{ + my $arg=shift; + + $tristate{$arg}="tristate"; +# printf "Tristate:%s\n",$arg; +} + +sub add_config($) +{ + my $arg=shift; + + if ($arg =~ m/^([A-Z0-9_]+)/) { + $config{$1} = 1; + } +} + +sub check_deps($) +{ + my $arg=shift; + $arg=$arg." "; + + while ($arg ne "") { + if ($arg =~ m/^([A-Z0-9_]+) /) { + my $val=$1; + my $prev=$depend{$val}; + $depend { $val } = 1+$prev; + } + $arg =~ s/^[^ ]+ //; + } +} sub open_kconfig($$) { my ($dir,$file)=@_; my $in = new FileHandle; + my $skip=0; + my $key; -print "opening $file\n"; +#print "opening $file\n"; open $in,"$file"; while (<$in>) { - if (m;^\s*source[\s\"]+drivers/media/(video|dvb)/Kconfig;) { - next; - } +# if (m;^\s*source[\s\"]+drivers/media/(video|dvb)/Kconfig;) { +# next; +# } if (m|^\s*source[\s\"]+([^\n\s\"]+)[\n\s\"]|) { open_kconfig($dir,"$dir/$1"); next; } + if (m|^\s+depends on (.*)\n|) { + check_deps ($1); + } + if (m|^\s+select (.*)\n|) { + check_deps ($1); + } + if (m|^\s*bool\s+|) { + add_bool($key); + } + if (m|^\s*tristate\s+|) { + add_tristate($key); + } + if (m|^\s*config (.*)\n|) { + $key=$1; + add_config ($1); + + my $min=$minver { $key }; + my $minversion, $minlevel, $minsublevel; + if ($min =~ m/(\d+)\.(\d+)\.(\d+)/) { + $minversion=$1; + $minlevel=$2; + $minsublevel=$3; + } else { + die "Minimum version for $key not found at versions.txt"; + } + if ( ($version < $minversion) | + ($level < $minlevel) | + ($sublevel < $minsublevel) ) { + $skip=1; + printf "$key requires version $minversion.$minlevel.$minsublevel\n"; + + print OUT "# $key disabled due to incorrect version\nconfig $key\n\ttristate\n\tdefault n\n\n"; + next; + } else { +# printf "OK: $key requires version $minversion.$minlevel.$minsublevel\n"; + $skip=0; + } + } + s/^main(menu\s\"[^\"]+)/\1 - DON'T CHANGE IT!/; - print OUT $_; + if (m/^[\w]/) { + $skip=0; + } + if (!$skip) { + print OUT $_; + } } close $in; } -open OUT,">Kconfig.kern"; -open_kconfig($KDIR,"$KDIR/arch/$ARCH/Kconfig"); -print OUT "endmenu\n"; -close OUT; +sub parse_versions () +{ + my $in = new FileHandle; + my $ver; + + open $in,"versions.txt"; + while (<$in>) { + if (m/\[([\d.]*)\]/) { + $ver=$1; + next; + } + s/\n//; + if (m/^\s*([\w\d_]+)/) { + $minver { $1 } = $ver; +# printf ("%s=%s\n",$1,$ver); + } + } + close $in; +} + +parse_versions; + +open IN,".version"; +while (<IN>) { + if (m/KERNELRELEASE\s*[:]*[=]+\s*(\d+)\.(\d+)\.(\d+)/) { + $version=$1; + $level=$2; + $sublevel=$3; + } +} +close IN; + +printf "Preparing to compile for kernel version %d.%d.%d\n",$version,$level,$sublevel; open OUT,">Kconfig"; print OUT "mainmenu \"V4L/DVB menu\"\n"; -open_kconfig ("../linux","../linux/drivers/media/video/Kconfig"); -open_kconfig ("../linux","../linux/drivers/media/dvb/Kconfig"); + print OUT "source Kconfig.kern\n"; +open_kconfig ("../linux","../linux/drivers/media/Kconfig"); +close OUT; + +while ( my ($key, $value) = each(%config) ) { + delete $depend{$key}; +} + +open OUT,">Kconfig.kern"; + +print OUT "config MODULES\n\tboolean\n\tdefault y\n\n"; +$tristate{"MODULES"}="bool"; + +while ( my ($key, $value) = each(%depend) ) { + print OUT "# $key with $value refs\nconfig $key\n\ttristate\n\tdefault m\n\n"; +} close OUT; + +if (($force_kconfig eq 1) || !open IN,".config") { + open OUT,">.config"; + while ( my ($key,$value) = each(%tristate) ) { + + if ( ($key eq "DVB_AV7110_FIRMWARE") || + ($key eq "DVB_CINERGYT2_TUNING") ) { + printf OUT "CONFIG_%s=n\n",$key; + } else { + if ($value eq "tristate") { + printf OUT "CONFIG_%s=m\n",$key; + } else { + printf OUT "CONFIG_%s=y\n",$key; + } + } + } + close OUT; +} |