xref: /utopia/UTPA2-700.0.x/projects/build/scripts/kconfig/streamline_config.pl (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi#!/usr/bin/perl -w
2*53ee8cc1Swenshuai.xi#
3*53ee8cc1Swenshuai.xi# Copyright 2005-2009 - Steven Rostedt
4*53ee8cc1Swenshuai.xi# Licensed under the terms of the GNU GPL License version 2
5*53ee8cc1Swenshuai.xi#
6*53ee8cc1Swenshuai.xi#  It's simple enough to figure out how this works.
7*53ee8cc1Swenshuai.xi#  If not, then you can ask me at stripconfig@goodmis.org
8*53ee8cc1Swenshuai.xi#
9*53ee8cc1Swenshuai.xi# What it does?
10*53ee8cc1Swenshuai.xi#
11*53ee8cc1Swenshuai.xi#   If you have installed a Linux kernel from a distribution
12*53ee8cc1Swenshuai.xi#   that turns on way too many modules than you need, and
13*53ee8cc1Swenshuai.xi#   you only want the modules you use, then this program
14*53ee8cc1Swenshuai.xi#   is perfect for you.
15*53ee8cc1Swenshuai.xi#
16*53ee8cc1Swenshuai.xi#   It gives you the ability to turn off all the modules that are
17*53ee8cc1Swenshuai.xi#   not loaded on your system.
18*53ee8cc1Swenshuai.xi#
19*53ee8cc1Swenshuai.xi# Howto:
20*53ee8cc1Swenshuai.xi#
21*53ee8cc1Swenshuai.xi#  1. Boot up the kernel that you want to stream line the config on.
22*53ee8cc1Swenshuai.xi#  2. Change directory to the directory holding the source of the
23*53ee8cc1Swenshuai.xi#       kernel that you just booted.
24*53ee8cc1Swenshuai.xi#  3. Copy the configuraton file to this directory as .config
25*53ee8cc1Swenshuai.xi#  4. Have all your devices that you need modules for connected and
26*53ee8cc1Swenshuai.xi#      operational (make sure that their corresponding modules are loaded)
27*53ee8cc1Swenshuai.xi#  5. Run this script redirecting the output to some other file
28*53ee8cc1Swenshuai.xi#       like config_strip.
29*53ee8cc1Swenshuai.xi#  6. Back up your old config (if you want too).
30*53ee8cc1Swenshuai.xi#  7. copy the config_strip file to .config
31*53ee8cc1Swenshuai.xi#  8. Run "make oldconfig"
32*53ee8cc1Swenshuai.xi#
33*53ee8cc1Swenshuai.xi#  Now your kernel is ready to be built with only the modules that
34*53ee8cc1Swenshuai.xi#  are loaded.
35*53ee8cc1Swenshuai.xi#
36*53ee8cc1Swenshuai.xi# Here's what I did with my Debian distribution.
37*53ee8cc1Swenshuai.xi#
38*53ee8cc1Swenshuai.xi#    cd /usr/src/linux-2.6.10
39*53ee8cc1Swenshuai.xi#    cp /boot/config-2.6.10-1-686-smp .config
40*53ee8cc1Swenshuai.xi#    ~/bin/streamline_config > config_strip
41*53ee8cc1Swenshuai.xi#    mv .config config_sav
42*53ee8cc1Swenshuai.xi#    mv config_strip .config
43*53ee8cc1Swenshuai.xi#    make oldconfig
44*53ee8cc1Swenshuai.xi#
45*53ee8cc1Swenshuai.xiuse strict;
46*53ee8cc1Swenshuai.xi
47*53ee8cc1Swenshuai.ximy $config = ".config";
48*53ee8cc1Swenshuai.xi
49*53ee8cc1Swenshuai.ximy $uname = `uname -r`;
50*53ee8cc1Swenshuai.xichomp $uname;
51*53ee8cc1Swenshuai.xi
52*53ee8cc1Swenshuai.ximy @searchconfigs = (
53*53ee8cc1Swenshuai.xi	{
54*53ee8cc1Swenshuai.xi	    "file" => ".config",
55*53ee8cc1Swenshuai.xi	    "exec" => "cat",
56*53ee8cc1Swenshuai.xi	},
57*53ee8cc1Swenshuai.xi	{
58*53ee8cc1Swenshuai.xi	    "file" => "/proc/config.gz",
59*53ee8cc1Swenshuai.xi	    "exec" => "zcat",
60*53ee8cc1Swenshuai.xi	},
61*53ee8cc1Swenshuai.xi	{
62*53ee8cc1Swenshuai.xi	    "file" => "/boot/config-$uname",
63*53ee8cc1Swenshuai.xi	    "exec" => "cat",
64*53ee8cc1Swenshuai.xi	},
65*53ee8cc1Swenshuai.xi	{
66*53ee8cc1Swenshuai.xi	    "file" => "/boot/vmlinuz-$uname",
67*53ee8cc1Swenshuai.xi	    "exec" => "scripts/extract-ikconfig",
68*53ee8cc1Swenshuai.xi	    "test" => "scripts/extract-ikconfig",
69*53ee8cc1Swenshuai.xi	},
70*53ee8cc1Swenshuai.xi	{
71*53ee8cc1Swenshuai.xi	    "file" => "vmlinux",
72*53ee8cc1Swenshuai.xi	    "exec" => "scripts/extract-ikconfig",
73*53ee8cc1Swenshuai.xi	    "test" => "scripts/extract-ikconfig",
74*53ee8cc1Swenshuai.xi	},
75*53ee8cc1Swenshuai.xi	{
76*53ee8cc1Swenshuai.xi	    "file" => "/lib/modules/$uname/kernel/kernel/configs.ko",
77*53ee8cc1Swenshuai.xi	    "exec" => "scripts/extract-ikconfig",
78*53ee8cc1Swenshuai.xi	    "test" => "scripts/extract-ikconfig",
79*53ee8cc1Swenshuai.xi	},
80*53ee8cc1Swenshuai.xi	{
81*53ee8cc1Swenshuai.xi	    "file" => "kernel/configs.ko",
82*53ee8cc1Swenshuai.xi	    "exec" => "scripts/extract-ikconfig",
83*53ee8cc1Swenshuai.xi	    "test" => "scripts/extract-ikconfig",
84*53ee8cc1Swenshuai.xi	},
85*53ee8cc1Swenshuai.xi	{
86*53ee8cc1Swenshuai.xi	    "file" => "kernel/configs.o",
87*53ee8cc1Swenshuai.xi	    "exec" => "scripts/extract-ikconfig",
88*53ee8cc1Swenshuai.xi	    "test" => "scripts/extract-ikconfig",
89*53ee8cc1Swenshuai.xi	},
90*53ee8cc1Swenshuai.xi);
91*53ee8cc1Swenshuai.xi
92*53ee8cc1Swenshuai.xisub find_config {
93*53ee8cc1Swenshuai.xi    foreach my $conf (@searchconfigs) {
94*53ee8cc1Swenshuai.xi	my $file = $conf->{"file"};
95*53ee8cc1Swenshuai.xi
96*53ee8cc1Swenshuai.xi	next if ( ! -f "$file");
97*53ee8cc1Swenshuai.xi
98*53ee8cc1Swenshuai.xi	if (defined($conf->{"test"})) {
99*53ee8cc1Swenshuai.xi	    `$conf->{"test"} $conf->{"file"} 2>/dev/null`;
100*53ee8cc1Swenshuai.xi	    next if ($?);
101*53ee8cc1Swenshuai.xi	}
102*53ee8cc1Swenshuai.xi
103*53ee8cc1Swenshuai.xi	my $exec = $conf->{"exec"};
104*53ee8cc1Swenshuai.xi
105*53ee8cc1Swenshuai.xi	print STDERR "using config: '$file'\n";
106*53ee8cc1Swenshuai.xi
107*53ee8cc1Swenshuai.xi	open(CIN, "$exec $file |") || die "Failed to run $exec $file";
108*53ee8cc1Swenshuai.xi	return;
109*53ee8cc1Swenshuai.xi    }
110*53ee8cc1Swenshuai.xi    die "No config file found";
111*53ee8cc1Swenshuai.xi}
112*53ee8cc1Swenshuai.xi
113*53ee8cc1Swenshuai.xifind_config;
114*53ee8cc1Swenshuai.xi
115*53ee8cc1Swenshuai.xi# Get the build source and top level Kconfig file (passed in)
116*53ee8cc1Swenshuai.ximy $ksource = $ARGV[0];
117*53ee8cc1Swenshuai.ximy $kconfig = $ARGV[1];
118*53ee8cc1Swenshuai.ximy $lsmod_file = $ARGV[2];
119*53ee8cc1Swenshuai.xi
120*53ee8cc1Swenshuai.ximy @makefiles = `find $ksource -name Makefile 2>/dev/null`;
121*53ee8cc1Swenshuai.xichomp @makefiles;
122*53ee8cc1Swenshuai.xi
123*53ee8cc1Swenshuai.ximy %depends;
124*53ee8cc1Swenshuai.ximy %selects;
125*53ee8cc1Swenshuai.ximy %prompts;
126*53ee8cc1Swenshuai.ximy %objects;
127*53ee8cc1Swenshuai.ximy $var;
128*53ee8cc1Swenshuai.ximy $iflevel = 0;
129*53ee8cc1Swenshuai.ximy @ifdeps;
130*53ee8cc1Swenshuai.xi
131*53ee8cc1Swenshuai.xi# prevent recursion
132*53ee8cc1Swenshuai.ximy %read_kconfigs;
133*53ee8cc1Swenshuai.xi
134*53ee8cc1Swenshuai.xisub read_kconfig {
135*53ee8cc1Swenshuai.xi    my ($kconfig) = @_;
136*53ee8cc1Swenshuai.xi
137*53ee8cc1Swenshuai.xi    my $state = "NONE";
138*53ee8cc1Swenshuai.xi    my $config;
139*53ee8cc1Swenshuai.xi    my @kconfigs;
140*53ee8cc1Swenshuai.xi
141*53ee8cc1Swenshuai.xi    my $cont = 0;
142*53ee8cc1Swenshuai.xi    my $line;
143*53ee8cc1Swenshuai.xi
144*53ee8cc1Swenshuai.xi    my $source = "$ksource/$kconfig";
145*53ee8cc1Swenshuai.xi    my $last_source = "";
146*53ee8cc1Swenshuai.xi
147*53ee8cc1Swenshuai.xi    # Check for any environment variables used
148*53ee8cc1Swenshuai.xi    while ($source =~ /\$(\w+)/ && $last_source ne $source) {
149*53ee8cc1Swenshuai.xi	my $env = $1;
150*53ee8cc1Swenshuai.xi	$last_source = $source;
151*53ee8cc1Swenshuai.xi	$source =~ s/\$$env/$ENV{$env}/;
152*53ee8cc1Swenshuai.xi    }
153*53ee8cc1Swenshuai.xi
154*53ee8cc1Swenshuai.xi    open(KIN, "$source") || die "Can't open $kconfig";
155*53ee8cc1Swenshuai.xi    while (<KIN>) {
156*53ee8cc1Swenshuai.xi	chomp;
157*53ee8cc1Swenshuai.xi
158*53ee8cc1Swenshuai.xi	# Make sure that lines ending with \ continue
159*53ee8cc1Swenshuai.xi	if ($cont) {
160*53ee8cc1Swenshuai.xi	    $_ = $line . " " . $_;
161*53ee8cc1Swenshuai.xi	}
162*53ee8cc1Swenshuai.xi
163*53ee8cc1Swenshuai.xi	if (s/\\$//) {
164*53ee8cc1Swenshuai.xi	    $cont = 1;
165*53ee8cc1Swenshuai.xi	    $line = $_;
166*53ee8cc1Swenshuai.xi	    next;
167*53ee8cc1Swenshuai.xi	}
168*53ee8cc1Swenshuai.xi
169*53ee8cc1Swenshuai.xi	$cont = 0;
170*53ee8cc1Swenshuai.xi
171*53ee8cc1Swenshuai.xi	# collect any Kconfig sources
172*53ee8cc1Swenshuai.xi	if (/^source\s*"(.*)"/) {
173*53ee8cc1Swenshuai.xi	    $kconfigs[$#kconfigs+1] = $1;
174*53ee8cc1Swenshuai.xi	}
175*53ee8cc1Swenshuai.xi
176*53ee8cc1Swenshuai.xi	# configs found
177*53ee8cc1Swenshuai.xi	if (/^\s*(menu)?config\s+(\S+)\s*$/) {
178*53ee8cc1Swenshuai.xi	    $state = "NEW";
179*53ee8cc1Swenshuai.xi	    $config = $2;
180*53ee8cc1Swenshuai.xi
181*53ee8cc1Swenshuai.xi	    for (my $i = 0; $i < $iflevel; $i++) {
182*53ee8cc1Swenshuai.xi		if ($i) {
183*53ee8cc1Swenshuai.xi		    $depends{$config} .= " " . $ifdeps[$i];
184*53ee8cc1Swenshuai.xi		} else {
185*53ee8cc1Swenshuai.xi		    $depends{$config} = $ifdeps[$i];
186*53ee8cc1Swenshuai.xi		}
187*53ee8cc1Swenshuai.xi		$state = "DEP";
188*53ee8cc1Swenshuai.xi	    }
189*53ee8cc1Swenshuai.xi
190*53ee8cc1Swenshuai.xi	# collect the depends for the config
191*53ee8cc1Swenshuai.xi	} elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
192*53ee8cc1Swenshuai.xi	    $state = "DEP";
193*53ee8cc1Swenshuai.xi	    $depends{$config} = $1;
194*53ee8cc1Swenshuai.xi	} elsif ($state eq "DEP" && /^\s*depends\s+on\s+(.*)$/) {
195*53ee8cc1Swenshuai.xi	    $depends{$config} .= " " . $1;
196*53ee8cc1Swenshuai.xi
197*53ee8cc1Swenshuai.xi	# Get the configs that select this config
198*53ee8cc1Swenshuai.xi	} elsif ($state ne "NONE" && /^\s*select\s+(\S+)/) {
199*53ee8cc1Swenshuai.xi	    if (defined($selects{$1})) {
200*53ee8cc1Swenshuai.xi		$selects{$1} .= " " . $config;
201*53ee8cc1Swenshuai.xi	    } else {
202*53ee8cc1Swenshuai.xi		$selects{$1} = $config;
203*53ee8cc1Swenshuai.xi	    }
204*53ee8cc1Swenshuai.xi
205*53ee8cc1Swenshuai.xi	# configs without prompts must be selected
206*53ee8cc1Swenshuai.xi	} elsif ($state ne "NONE" && /^\s*tristate\s\S/) {
207*53ee8cc1Swenshuai.xi	    # note if the config has a prompt
208*53ee8cc1Swenshuai.xi	    $prompts{$config} = 1;
209*53ee8cc1Swenshuai.xi
210*53ee8cc1Swenshuai.xi	# Check for if statements
211*53ee8cc1Swenshuai.xi	} elsif (/^if\s+(.*\S)\s*$/) {
212*53ee8cc1Swenshuai.xi	    my $deps = $1;
213*53ee8cc1Swenshuai.xi	    # remove beginning and ending non text
214*53ee8cc1Swenshuai.xi	    $deps =~ s/^[^a-zA-Z0-9_]*//;
215*53ee8cc1Swenshuai.xi	    $deps =~ s/[^a-zA-Z0-9_]*$//;
216*53ee8cc1Swenshuai.xi
217*53ee8cc1Swenshuai.xi	    my @deps = split /[^a-zA-Z0-9_]+/, $deps;
218*53ee8cc1Swenshuai.xi
219*53ee8cc1Swenshuai.xi	    $ifdeps[$iflevel++] = join ':', @deps;
220*53ee8cc1Swenshuai.xi
221*53ee8cc1Swenshuai.xi	} elsif (/^endif/) {
222*53ee8cc1Swenshuai.xi
223*53ee8cc1Swenshuai.xi	    $iflevel-- if ($iflevel);
224*53ee8cc1Swenshuai.xi
225*53ee8cc1Swenshuai.xi	# stop on "help"
226*53ee8cc1Swenshuai.xi	} elsif (/^\s*help\s*$/) {
227*53ee8cc1Swenshuai.xi	    $state = "NONE";
228*53ee8cc1Swenshuai.xi	}
229*53ee8cc1Swenshuai.xi    }
230*53ee8cc1Swenshuai.xi    close(KIN);
231*53ee8cc1Swenshuai.xi
232*53ee8cc1Swenshuai.xi    # read in any configs that were found.
233*53ee8cc1Swenshuai.xi    foreach $kconfig (@kconfigs) {
234*53ee8cc1Swenshuai.xi	if (!defined($read_kconfigs{$kconfig})) {
235*53ee8cc1Swenshuai.xi	    $read_kconfigs{$kconfig} = 1;
236*53ee8cc1Swenshuai.xi	    read_kconfig($kconfig);
237*53ee8cc1Swenshuai.xi	}
238*53ee8cc1Swenshuai.xi    }
239*53ee8cc1Swenshuai.xi}
240*53ee8cc1Swenshuai.xi
241*53ee8cc1Swenshuai.xiif ($kconfig) {
242*53ee8cc1Swenshuai.xi    read_kconfig($kconfig);
243*53ee8cc1Swenshuai.xi}
244*53ee8cc1Swenshuai.xi
245*53ee8cc1Swenshuai.xisub convert_vars {
246*53ee8cc1Swenshuai.xi    my ($line, %vars) = @_;
247*53ee8cc1Swenshuai.xi
248*53ee8cc1Swenshuai.xi    my $process = "";
249*53ee8cc1Swenshuai.xi
250*53ee8cc1Swenshuai.xi    while ($line =~ s/^(.*?)(\$\((.*?)\))//) {
251*53ee8cc1Swenshuai.xi	my $start = $1;
252*53ee8cc1Swenshuai.xi	my $variable = $2;
253*53ee8cc1Swenshuai.xi	my $var = $3;
254*53ee8cc1Swenshuai.xi
255*53ee8cc1Swenshuai.xi	if (defined($vars{$var})) {
256*53ee8cc1Swenshuai.xi	    $process .= $start . $vars{$var};
257*53ee8cc1Swenshuai.xi	} else {
258*53ee8cc1Swenshuai.xi	    $process .= $start . $variable;
259*53ee8cc1Swenshuai.xi	}
260*53ee8cc1Swenshuai.xi    }
261*53ee8cc1Swenshuai.xi
262*53ee8cc1Swenshuai.xi    $process .= $line;
263*53ee8cc1Swenshuai.xi
264*53ee8cc1Swenshuai.xi    return $process;
265*53ee8cc1Swenshuai.xi}
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi# Read all Makefiles to map the configs to the objects
268*53ee8cc1Swenshuai.xiforeach my $makefile (@makefiles) {
269*53ee8cc1Swenshuai.xi
270*53ee8cc1Swenshuai.xi    my $line = "";
271*53ee8cc1Swenshuai.xi    my %make_vars;
272*53ee8cc1Swenshuai.xi
273*53ee8cc1Swenshuai.xi    open(MIN,$makefile) || die "Can't open $makefile";
274*53ee8cc1Swenshuai.xi    while (<MIN>) {
275*53ee8cc1Swenshuai.xi	# if this line ends with a backslash, continue
276*53ee8cc1Swenshuai.xi	chomp;
277*53ee8cc1Swenshuai.xi	if (/^(.*)\\$/) {
278*53ee8cc1Swenshuai.xi	    $line .= $1;
279*53ee8cc1Swenshuai.xi	    next;
280*53ee8cc1Swenshuai.xi	}
281*53ee8cc1Swenshuai.xi
282*53ee8cc1Swenshuai.xi	$line .= $_;
283*53ee8cc1Swenshuai.xi	$_ = $line;
284*53ee8cc1Swenshuai.xi	$line = "";
285*53ee8cc1Swenshuai.xi
286*53ee8cc1Swenshuai.xi	my $objs;
287*53ee8cc1Swenshuai.xi
288*53ee8cc1Swenshuai.xi	$_ = convert_vars($_, %make_vars);
289*53ee8cc1Swenshuai.xi
290*53ee8cc1Swenshuai.xi	# collect objects after obj-$(CONFIG_FOO_BAR)
291*53ee8cc1Swenshuai.xi	if (/obj-\$\((CONFIG_[^\)]*)\)\s*[+:]?=\s*(.*)/) {
292*53ee8cc1Swenshuai.xi	    $var = $1;
293*53ee8cc1Swenshuai.xi	    $objs = $2;
294*53ee8cc1Swenshuai.xi
295*53ee8cc1Swenshuai.xi	# check if variables are set
296*53ee8cc1Swenshuai.xi	} elsif (/^\s*(\S+)\s*[:]?=\s*(.*\S)/) {
297*53ee8cc1Swenshuai.xi	    $make_vars{$1} = $2;
298*53ee8cc1Swenshuai.xi	}
299*53ee8cc1Swenshuai.xi	if (defined($objs)) {
300*53ee8cc1Swenshuai.xi	    foreach my $obj (split /\s+/,$objs) {
301*53ee8cc1Swenshuai.xi		$obj =~ s/-/_/g;
302*53ee8cc1Swenshuai.xi		if ($obj =~ /(.*)\.o$/) {
303*53ee8cc1Swenshuai.xi		    # Objects may be enabled by more than one config.
304*53ee8cc1Swenshuai.xi		    # Store configs in an array.
305*53ee8cc1Swenshuai.xi		    my @arr;
306*53ee8cc1Swenshuai.xi
307*53ee8cc1Swenshuai.xi		    if (defined($objects{$1})) {
308*53ee8cc1Swenshuai.xi			@arr = @{$objects{$1}};
309*53ee8cc1Swenshuai.xi		    }
310*53ee8cc1Swenshuai.xi
311*53ee8cc1Swenshuai.xi		    $arr[$#arr+1] = $var;
312*53ee8cc1Swenshuai.xi
313*53ee8cc1Swenshuai.xi		    # The objects have a hash mapping to a reference
314*53ee8cc1Swenshuai.xi		    # of an array of configs.
315*53ee8cc1Swenshuai.xi		    $objects{$1} = \@arr;
316*53ee8cc1Swenshuai.xi		}
317*53ee8cc1Swenshuai.xi	    }
318*53ee8cc1Swenshuai.xi	}
319*53ee8cc1Swenshuai.xi    }
320*53ee8cc1Swenshuai.xi    close(MIN);
321*53ee8cc1Swenshuai.xi}
322*53ee8cc1Swenshuai.xi
323*53ee8cc1Swenshuai.ximy %modules;
324*53ee8cc1Swenshuai.xi
325*53ee8cc1Swenshuai.xiif (defined($lsmod_file)) {
326*53ee8cc1Swenshuai.xi    if ( ! -f $lsmod_file) {
327*53ee8cc1Swenshuai.xi	die "$lsmod_file not found";
328*53ee8cc1Swenshuai.xi    }
329*53ee8cc1Swenshuai.xi    if ( -x $lsmod_file) {
330*53ee8cc1Swenshuai.xi	# the file is executable, run it
331*53ee8cc1Swenshuai.xi	open(LIN, "$lsmod_file|");
332*53ee8cc1Swenshuai.xi    } else {
333*53ee8cc1Swenshuai.xi	# Just read the contents
334*53ee8cc1Swenshuai.xi	open(LIN, "$lsmod_file");
335*53ee8cc1Swenshuai.xi    }
336*53ee8cc1Swenshuai.xi} else {
337*53ee8cc1Swenshuai.xi
338*53ee8cc1Swenshuai.xi    # see what modules are loaded on this system
339*53ee8cc1Swenshuai.xi    my $lsmod;
340*53ee8cc1Swenshuai.xi
341*53ee8cc1Swenshuai.xi    foreach my $dir ( ("/sbin", "/bin", "/usr/sbin", "/usr/bin") ) {
342*53ee8cc1Swenshuai.xi	if ( -x "$dir/lsmod" ) {
343*53ee8cc1Swenshuai.xi	    $lsmod = "$dir/lsmod";
344*53ee8cc1Swenshuai.xi	    last;
345*53ee8cc1Swenshuai.xi	}
346*53ee8cc1Swenshuai.xi}
347*53ee8cc1Swenshuai.xi    if (!defined($lsmod)) {
348*53ee8cc1Swenshuai.xi	# try just the path
349*53ee8cc1Swenshuai.xi	$lsmod = "lsmod";
350*53ee8cc1Swenshuai.xi    }
351*53ee8cc1Swenshuai.xi
352*53ee8cc1Swenshuai.xi    open(LIN,"$lsmod|") || die "Can not call lsmod with $lsmod";
353*53ee8cc1Swenshuai.xi}
354*53ee8cc1Swenshuai.xi
355*53ee8cc1Swenshuai.xiwhile (<LIN>) {
356*53ee8cc1Swenshuai.xi	next if (/^Module/);  # Skip the first line.
357*53ee8cc1Swenshuai.xi	if (/^(\S+)/) {
358*53ee8cc1Swenshuai.xi		$modules{$1} = 1;
359*53ee8cc1Swenshuai.xi	}
360*53ee8cc1Swenshuai.xi}
361*53ee8cc1Swenshuai.xiclose (LIN);
362*53ee8cc1Swenshuai.xi
363*53ee8cc1Swenshuai.xi# add to the configs hash all configs that are needed to enable
364*53ee8cc1Swenshuai.xi# a loaded module.
365*53ee8cc1Swenshuai.ximy %configs;
366*53ee8cc1Swenshuai.xiforeach my $module (keys(%modules)) {
367*53ee8cc1Swenshuai.xi    if (defined($objects{$module})) {
368*53ee8cc1Swenshuai.xi	my @arr = @{$objects{$module}};
369*53ee8cc1Swenshuai.xi	foreach my $conf (@arr) {
370*53ee8cc1Swenshuai.xi	    $configs{$conf} = $module;
371*53ee8cc1Swenshuai.xi	}
372*53ee8cc1Swenshuai.xi    } else {
373*53ee8cc1Swenshuai.xi	# Most likely, someone has a custom (binary?) module loaded.
374*53ee8cc1Swenshuai.xi	print STDERR "$module config not found!!\n";
375*53ee8cc1Swenshuai.xi    }
376*53ee8cc1Swenshuai.xi}
377*53ee8cc1Swenshuai.xi
378*53ee8cc1Swenshuai.ximy $valid = "A-Za-z_0-9";
379*53ee8cc1Swenshuai.ximy $repeat = 1;
380*53ee8cc1Swenshuai.xi
381*53ee8cc1Swenshuai.xi#
382*53ee8cc1Swenshuai.xi# Note, we do not care about operands (like: &&, ||, !) we want to add any
383*53ee8cc1Swenshuai.xi# config that is in the depend list of another config. This script does
384*53ee8cc1Swenshuai.xi# not enable configs that are not already enabled. If we come across a
385*53ee8cc1Swenshuai.xi# config A that depends on !B, we can still add B to the list of depends
386*53ee8cc1Swenshuai.xi# to keep on. If A was on in the original config, B would not have been
387*53ee8cc1Swenshuai.xi# and B would not be turned on by this script.
388*53ee8cc1Swenshuai.xi#
389*53ee8cc1Swenshuai.xisub parse_config_dep_select
390*53ee8cc1Swenshuai.xi{
391*53ee8cc1Swenshuai.xi    my ($p) = @_;
392*53ee8cc1Swenshuai.xi
393*53ee8cc1Swenshuai.xi    while ($p =~ /[$valid]/) {
394*53ee8cc1Swenshuai.xi
395*53ee8cc1Swenshuai.xi	if ($p =~ /^[^$valid]*([$valid]+)/) {
396*53ee8cc1Swenshuai.xi	    my $conf = "CONFIG_" . $1;
397*53ee8cc1Swenshuai.xi
398*53ee8cc1Swenshuai.xi	    $p =~ s/^[^$valid]*[$valid]+//;
399*53ee8cc1Swenshuai.xi
400*53ee8cc1Swenshuai.xi	    if (!defined($configs{$conf})) {
401*53ee8cc1Swenshuai.xi		# We must make sure that this config has its
402*53ee8cc1Swenshuai.xi		# dependencies met.
403*53ee8cc1Swenshuai.xi		$repeat = 1; # do again
404*53ee8cc1Swenshuai.xi		$configs{$conf} = 1;
405*53ee8cc1Swenshuai.xi	    }
406*53ee8cc1Swenshuai.xi	} else {
407*53ee8cc1Swenshuai.xi	    die "this should never happen";
408*53ee8cc1Swenshuai.xi	}
409*53ee8cc1Swenshuai.xi    }
410*53ee8cc1Swenshuai.xi}
411*53ee8cc1Swenshuai.xi
412*53ee8cc1Swenshuai.xiwhile ($repeat) {
413*53ee8cc1Swenshuai.xi    $repeat = 0;
414*53ee8cc1Swenshuai.xi
415*53ee8cc1Swenshuai.xi    foreach my $config (keys %configs) {
416*53ee8cc1Swenshuai.xi	$config =~ s/^CONFIG_//;
417*53ee8cc1Swenshuai.xi
418*53ee8cc1Swenshuai.xi	if (defined($depends{$config})) {
419*53ee8cc1Swenshuai.xi	    # This config has dependencies. Make sure they are also included
420*53ee8cc1Swenshuai.xi	    parse_config_dep_select $depends{$config};
421*53ee8cc1Swenshuai.xi	}
422*53ee8cc1Swenshuai.xi
423*53ee8cc1Swenshuai.xi	if (defined($prompts{$config}) || !defined($selects{$config})) {
424*53ee8cc1Swenshuai.xi	    next;
425*53ee8cc1Swenshuai.xi	}
426*53ee8cc1Swenshuai.xi
427*53ee8cc1Swenshuai.xi	# config has no prompt and must be selected.
428*53ee8cc1Swenshuai.xi	parse_config_dep_select $selects{$config};
429*53ee8cc1Swenshuai.xi    }
430*53ee8cc1Swenshuai.xi}
431*53ee8cc1Swenshuai.xi
432*53ee8cc1Swenshuai.ximy %setconfigs;
433*53ee8cc1Swenshuai.xi
434*53ee8cc1Swenshuai.xi# Finally, read the .config file and turn off any module enabled that
435*53ee8cc1Swenshuai.xi# we could not find a reason to keep enabled.
436*53ee8cc1Swenshuai.xiwhile(<CIN>) {
437*53ee8cc1Swenshuai.xi
438*53ee8cc1Swenshuai.xi    if (/CONFIG_IKCONFIG/) {
439*53ee8cc1Swenshuai.xi	if (/# CONFIG_IKCONFIG is not set/) {
440*53ee8cc1Swenshuai.xi	    # enable IKCONFIG at least as a module
441*53ee8cc1Swenshuai.xi	    print "CONFIG_IKCONFIG=m\n";
442*53ee8cc1Swenshuai.xi	    # don't ask about PROC
443*53ee8cc1Swenshuai.xi	    print "# CONFIG_IKCONFIG_PROC is not set\n";
444*53ee8cc1Swenshuai.xi	} else {
445*53ee8cc1Swenshuai.xi	    print;
446*53ee8cc1Swenshuai.xi	}
447*53ee8cc1Swenshuai.xi	next;
448*53ee8cc1Swenshuai.xi    }
449*53ee8cc1Swenshuai.xi
450*53ee8cc1Swenshuai.xi    if (/^(CONFIG.*)=(m|y)/) {
451*53ee8cc1Swenshuai.xi	if (defined($configs{$1})) {
452*53ee8cc1Swenshuai.xi	    $setconfigs{$1} = $2;
453*53ee8cc1Swenshuai.xi	} elsif ($2 eq "m") {
454*53ee8cc1Swenshuai.xi	    print "# $1 is not set\n";
455*53ee8cc1Swenshuai.xi	    next;
456*53ee8cc1Swenshuai.xi	}
457*53ee8cc1Swenshuai.xi    }
458*53ee8cc1Swenshuai.xi    print;
459*53ee8cc1Swenshuai.xi}
460*53ee8cc1Swenshuai.xiclose(CIN);
461*53ee8cc1Swenshuai.xi
462*53ee8cc1Swenshuai.xi# Integrity check, make sure all modules that we want enabled do
463*53ee8cc1Swenshuai.xi# indeed have their configs set.
464*53ee8cc1Swenshuai.xiloop:
465*53ee8cc1Swenshuai.xiforeach my $module (keys(%modules)) {
466*53ee8cc1Swenshuai.xi    if (defined($objects{$module})) {
467*53ee8cc1Swenshuai.xi	my @arr = @{$objects{$module}};
468*53ee8cc1Swenshuai.xi	foreach my $conf (@arr) {
469*53ee8cc1Swenshuai.xi	    if (defined($setconfigs{$conf})) {
470*53ee8cc1Swenshuai.xi		next loop;
471*53ee8cc1Swenshuai.xi	    }
472*53ee8cc1Swenshuai.xi	}
473*53ee8cc1Swenshuai.xi	print STDERR "module $module did not have configs";
474*53ee8cc1Swenshuai.xi	foreach my $conf (@arr) {
475*53ee8cc1Swenshuai.xi	    print STDERR " " , $conf;
476*53ee8cc1Swenshuai.xi	}
477*53ee8cc1Swenshuai.xi	print STDERR "\n";
478*53ee8cc1Swenshuai.xi    }
479*53ee8cc1Swenshuai.xi}
480