#!/usr/bin/perl use strict; my $kdir=shift or die "should specify a kernel dir"; my $infile=shift or die "should specify an input config file"; my $outfile=shift or die "should specify an output config file"; my $out; sub check_spin_lock() { my $file = "$kdir/include/linux/netdevice.h"; my $old_syntax = 1; open INNET, "<$file" or die "File not found: $file"; while () { if (m/netif_tx_lock_bh/) { $old_syntax = 0; last; } } if ($old_syntax) { $out.= "\n#define OLD_XMIT_LOCK 1\n"; } close INNET; } sub check_snd_ctl_boolean_mono_info() { my $file = "$kdir/include/sound/control.h"; my $old_syntax = 1; open INNET, "<$file" or die "File not found: $file"; while () { if (m/snd_ctl_boolean_mono_info/) { $old_syntax = 0; last; } } if ($old_syntax) { $out.= "\n#define COMPAT_SND_CTL_BOOLEAN_MONO 1\n"; } close INNET; } sub check_other_dependencies() { check_spin_lock(); check_snd_ctl_boolean_mono_info(); } # Do the basic rules open IN, "<$infile" or die "File not found: $infile"; $out.= "#ifndef __CONFIG_COMPAT_H__\n"; $out.= "#define __CONFIG_COMPAT_H__\n\n"; $out.= "#include \n\n"; while() { next unless /^(\S+)\s*:= (\S+)$/; $out.= "#undef $1\n"; $out.= "#undef $1_MODULE\n"; if($2 eq "n") { next; } elsif($2 eq "m") { $out.= "#define $1_MODULE 1\n"; } elsif($2 eq "y") { $out.= "#define $1 1\n"; } else { $out.= "#define $1 $2\n"; } } close IN; check_other_dependencies(); open OUT, ">$outfile" or die 'Unable to write $outfile'; print OUT "$out\n#endif\n"; close OUT