summaryrefslogtreecommitdiff
path: root/v4l/scripts/make_kconfig.pl
diff options
context:
space:
mode:
Diffstat (limited to 'v4l/scripts/make_kconfig.pl')
-rwxr-xr-xv4l/scripts/make_kconfig.pl188
1 files changed, 175 insertions, 13 deletions
diff --git a/v4l/scripts/make_kconfig.pl b/v4l/scripts/make_kconfig.pl
index b499fefa1..c58f5b028 100755
--- a/v4l/scripts/make_kconfig.pl
+++ b/v4l/scripts/make_kconfig.pl
@@ -7,10 +7,69 @@ my %config = ();
my %intopt = ();
my %hexopt = ();
my %tristate = ();
+my %kernopts = ();
+my %depmods = ();
my $version, $level, $sublevel;
+my $kernel=shift;
my $force_kconfig=shift;
+#!/usr/bin/perl
+use FileHandle;
+
+###########################################################
+# Checks config.h and autoconf.h for current kernel defines
+sub process_config ($)
+{
+ my $filename = shift;
+ my $in = new FileHandle;
+
+ open $in,"$kernel/include/$filename" or die;
+ while (<$in>) {
+ if (m|\#include\s+\<(.*)\>|) {
+ process_config ($1);
+ next;
+ }
+ if (m/\#define\s+CONFIG_([^ ]*)_ON_SMP\s+(.*)\n/) {
+ my $key=$1;
+ my $value=$2;
+# printf "defined $key as $value\n";
+ if ( $value == 1 ) {
+ $value='y';
+ }
+ $kernopts{$key}=$value;
+ next;
+ }
+ if (m/\#define\s+CONFIG_([^ ]*)_MODULE\s+(.*)\n/) {
+ my $key=$1;
+ my $value=$2;
+# printf "defined $key as $value\n";
+ if ( $value == 1 ) {
+ $value='m';
+ }
+ $kernopts{$key}=$value;
+ next;
+ }
+ if (m/\#define\s+CONFIG_([^ ]*)\s+(.*)\n/) {
+ my $key=$1;
+ my $value=$2;
+# printf "defined $key as $value\n";
+ if ( $value == 1 ) {
+ $value='y';
+ }
+ $kernopts{$key}=$value;
+ next;
+ }
+ if (m/\#undef\s+CONFIG_([^ ]*)\n/) {
+# printf "undefined $1\n";
+ $kernopts{$1}='n';
+ next;
+ }
+ }
+
+ close $in;
+}
+
sub add_bool($)
{
my $arg=shift;
@@ -18,6 +77,8 @@ sub add_bool($)
exists $config{$arg} or die "Adding unknown boolean '$arg'";
$tristate{$arg}="bool";
# printf "Boolean:%s\n",$arg;
+
+ $kernopts{$arg}='y';
}
sub add_tristate($)
@@ -26,7 +87,8 @@ sub add_tristate($)
exists $config{$arg} or die "Adding unknown tristate '$arg'";
$tristate{$arg}="tristate";
-# printf "Tristate:%s\n",$arg;
+
+ $kernopts{$arg}='m';
}
sub add_int($)
@@ -75,6 +137,7 @@ sub add_config($)
}
}
+########################################
# Turn option off, iff it already exists
sub disable_config($)
{
@@ -83,9 +146,14 @@ sub disable_config($)
$config{$key} = 0 if (exists $config{$key});
}
-sub check_deps($)
+#################################################################
+# Make a list of dependencies and the number of references for it
+sub check_deps($$)
{
+ my $key=shift;
my $arg=shift;
+
+ $depmods{$key}=$arg;
$arg=$arg." ";
while ($arg ne "") {
@@ -96,6 +164,44 @@ sub check_deps($)
}
$arg =~ s/^[^ ]+ //;
}
+
+ return $ok;
+}
+
+######################################################
+# Checks if all dependencies for the key are satisfied
+sub deps_ok($)
+{
+ my $key=shift;
+ my $arg=$depmods{$key};
+ my $ok=1;
+
+ if ($arg eq "") {
+ return $ok;
+ }
+
+ $arg=$arg." ";
+
+
+# printf "$key: deps are '$arg'\n";
+
+ while ($arg ne "") {
+ if ($arg =~ m/^([A-Z0-9_]+) /) {
+ if ((! exists $kernopts {$1}) || ($kernopts {$1} eq 'n')) {
+ printf "$key: Required kernel opt '$1' is not present\n";
+ $ok=0;
+ }
+ }
+ if ($arg =~ m/^\!([A-Z0-9_]+) /) {
+ if ($kernopts {$1} eq 'y') {
+ printf "$key: Driver is incompatible with '$1'\n";
+ $ok=0;
+ }
+ }
+ $arg =~ s/^[^ ]+ //;
+ }
+
+ return $ok;
}
sub open_kconfig($$) {
@@ -105,7 +211,7 @@ sub open_kconfig($$) {
my $key;
#print "opening $file\n";
- open $in,"$file";
+ open $in,"$file" or die;
while (<$in>) {
# if (m;^\s*source[\s\"]+drivers/media/(video|dvb)/Kconfig;) {
# next;
@@ -124,10 +230,10 @@ sub open_kconfig($$) {
next;
}
if (m|^\s+depends on\s+(.*)\n|) {
- check_deps ($1);
+ check_deps ($key,$1);
}
if (m|^\s+select\s+(.*)\n|) {
- check_deps ($1);
+ check_deps ($key,$1);
}
if (m|^\s+bool(ean)?\s|) {
add_bool($key);
@@ -155,7 +261,6 @@ sub open_kconfig($$) {
$default_seen = 1;
$_ = "\tdefault n\n";
}
-
# check for end of config definition for disabled drivers
# we need to make sure we've disabled it, and add a bit
# to the help text
@@ -211,7 +316,7 @@ sub parse_versions ()
my $in = new FileHandle;
my $ver;
- open $in,"versions.txt";
+ open $in,"versions.txt" or die;
while (<$in>) {
if (m/\[([\d.]*)\]/) {
$ver=$1;
@@ -226,9 +331,11 @@ sub parse_versions ()
close $in;
}
+process_config("linux/config.h");
+
parse_versions;
-open IN,".version";
+open IN,".version" or die;
while (<IN>) {
if (m/KERNELRELEASE\s*[:]*[=]+\s*(\d+)\.(\d+)\.(\d+)/) {
$version=$1;
@@ -240,7 +347,7 @@ close IN;
printf "Preparing to compile for kernel version %d.%d.%d\n",$version,$level,$sublevel;
-open OUT,">Kconfig";
+open OUT,">Kconfig" or die;
print OUT <<"EOF";
mainmenu "V4L/DVB menu"
@@ -273,14 +380,19 @@ while ( my ($key, $value) = each(%config) ) {
delete $depend{$key};
}
-open OUT,">Kconfig.kern";
+open OUT,">Kconfig.kern" or die;
print OUT "config MODULES\n\tboolean\n\tdefault y\n\n";
add_config('MODULES');
add_bool('MODULES');
while ( my ($key, $value) = each(%depend) ) {
- print OUT "# $key with $value refs\nconfig $key\n\ttristate\n\tdefault m\n\n";
+ if ($kernopts{$key}) {
+ print OUT "# $key with $value refs\nconfig $key\n\ttristate\n\tdefault ".
+ $kernopts{$key}."\n\n";
+ } else {
+ print OUT "# $key with $value refs\nconfig $key\n\ttristate\n\tdefault n #not found\n\n";
+ }
}
close OUT;
@@ -288,12 +400,62 @@ close OUT;
disable_config('DVB_AV7110_FIRMWARE');
disable_config('DVB_CINERGYT2_TUNING');
+# Hack for check sound/oss/aci.h header
+
+my $mirodep="$kernel/sound/oss/aci.h";
+if (!open IN, $mirodep) {
+ my $key="RADIO_MIROPCM20";
+print <<"EOF2";
+$key: $mirodep is missing.
+
+***WARNING:*** You do not have the full kernel sources installed.
+This does not prevent you from building the v4l-dvb tree if you have the
+kernel headers, but the full kernel source is required in order to use
+make menuconfig / xconfig / qconfig.
+
+If you are experiencing problems building the v4l-dvb tree, please try
+building against a vanilla kernel before reporting a bug.
+
+Vanilla kernels are available at http://kernel.org.
+On most distros, this will compile a newly downloaded kernel:
+
+cp /boot/config-`uname -r` <your kernel dir>/.config
+cd <your kernel dir>
+make all modules_install install
+
+Please see your distro's web site for instructions to build a new kernel.
+
+EOF2
+ $kernopts{$key}='n';
+}
+close IN;
+
+# Recursively check for broken dependencies
+my $i;
+do {
+ $i=0;
+ while ( my ($key,$value) = each(%kernopts) ) {
+ if ($value ne 'n') {
+ if (!deps_ok($key)) {
+ $kernopts{$key}='n';
+ }
+ $i=$i+1;
+ }
+ }
+} until (!$disable);
+
# Produce a .config file if it's forced or one doesn't already exist
if (($force_kconfig eq 1) || !open IN,".config") {
- open OUT,">.config";
+ open OUT,">.config" or die;
while ( my ($key,$value) = each(%tristate) ) {
if (!$config{$key}) {
- print OUT "CONFIG_$key=n\n";
+ print OUT "# CONFIG_$key is not set\n";
+ } elsif ($kernopts{$key}) {
+ if ($kernopts{$key} eq 'n') {
+ print OUT "# CONFIG_$key is not set\n";
+ } else {
+ print OUT "CONFIG_$key=".$kernopts{$key}."\n";
+ }
} elsif ($value eq 'tristate') {
print OUT "CONFIG_$key=m\n";
} else { # must be 'bool'