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