aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/kconfig/streamline_config.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/kconfig/streamline_config.pl')
-rw-r--r--scripts/kconfig/streamline_config.pl109
1 files changed, 97 insertions, 12 deletions
diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl
index 0d800820c3c..fd81fc33d63 100644
--- a/scripts/kconfig/streamline_config.pl
+++ b/scripts/kconfig/streamline_config.pl
@@ -42,6 +42,8 @@
42# mv config_strip .config 42# mv config_strip .config
43# make oldconfig 43# make oldconfig
44# 44#
45use strict;
46
45my $config = ".config"; 47my $config = ".config";
46 48
47my $uname = `uname -r`; 49my $uname = `uname -r`;
@@ -113,14 +115,18 @@ find_config;
113# Get the build source and top level Kconfig file (passed in) 115# Get the build source and top level Kconfig file (passed in)
114my $ksource = $ARGV[0]; 116my $ksource = $ARGV[0];
115my $kconfig = $ARGV[1]; 117my $kconfig = $ARGV[1];
118my $lsmod_file = $ARGV[2];
119
120my @makefiles = `find $ksource -name Makefile 2>/dev/null`;
121chomp @makefiles;
116 122
117my @makefiles = `find $ksource -name Makefile`;
118my %depends; 123my %depends;
119my %selects; 124my %selects;
120my %prompts; 125my %prompts;
121my %objects; 126my %objects;
122my $var; 127my $var;
123my $cont = 0; 128my $iflevel = 0;
129my @ifdeps;
124 130
125# prevent recursion 131# prevent recursion
126my %read_kconfigs; 132my %read_kconfigs;
@@ -132,19 +138,54 @@ sub read_kconfig {
132 my $config; 138 my $config;
133 my @kconfigs; 139 my @kconfigs;
134 140
135 open(KIN, "$ksource/$kconfig") || die "Can't open $kconfig"; 141 my $cont = 0;
142 my $line;
143
144 my $source = "$ksource/$kconfig";
145 my $last_source = "";
146
147 # Check for any environment variables used
148 while ($source =~ /\$(\w+)/ && $last_source ne $source) {
149 my $env = $1;
150 $last_source = $source;
151 $source =~ s/\$$env/$ENV{$env}/;
152 }
153
154 open(KIN, "$source") || die "Can't open $kconfig";
136 while (<KIN>) { 155 while (<KIN>) {
137 chomp; 156 chomp;
138 157
158 # Make sure that lines ending with \ continue
159 if ($cont) {
160 $_ = $line . " " . $_;
161 }
162
163 if (s/\\$//) {
164 $cont = 1;
165 $line = $_;
166 next;
167 }
168
169 $cont = 0;
170
139 # collect any Kconfig sources 171 # collect any Kconfig sources
140 if (/^source\s*"(.*)"/) { 172 if (/^source\s*"(.*)"/) {
141 $kconfigs[$#kconfigs+1] = $1; 173 $kconfigs[$#kconfigs+1] = $1;
142 } 174 }
143 175
144 # configs found 176 # configs found
145 if (/^\s*config\s+(\S+)\s*$/) { 177 if (/^\s*(menu)?config\s+(\S+)\s*$/) {
146 $state = "NEW"; 178 $state = "NEW";
147 $config = $1; 179 $config = $2;
180
181 for (my $i = 0; $i < $iflevel; $i++) {
182 if ($i) {
183 $depends{$config} .= " " . $ifdeps[$i];
184 } else {
185 $depends{$config} = $ifdeps[$i];
186 }
187 $state = "DEP";
188 }
148 189
149 # collect the depends for the config 190 # collect the depends for the config
150 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) { 191 } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
@@ -164,7 +205,22 @@ sub read_kconfig {
164 # configs without prompts must be selected 205 # configs without prompts must be selected
165 } elsif ($state ne "NONE" && /^\s*tristate\s\S/) { 206 } elsif ($state ne "NONE" && /^\s*tristate\s\S/) {
166 # note if the config has a prompt 207 # note if the config has a prompt
167 $prompt{$config} = 1; 208 $prompts{$config} = 1;
209
210 # Check for if statements
211 } elsif (/^if\s+(.*\S)\s*$/) {
212 my $deps = $1;
213 # remove beginning and ending non text
214 $deps =~ s/^[^a-zA-Z0-9_]*//;
215 $deps =~ s/[^a-zA-Z0-9_]*$//;
216
217 my @deps = split /[^a-zA-Z0-9_]+/, $deps;
218
219 $ifdeps[$iflevel++] = join ':', @deps;
220
221 } elsif (/^endif/) {
222
223 $iflevel-- if ($iflevel);
168 224
169 # stop on "help" 225 # stop on "help"
170 } elsif (/^\s*help\s*$/) { 226 } elsif (/^\s*help\s*$/) {
@@ -188,7 +244,8 @@ if ($kconfig) {
188 244
189# Read all Makefiles to map the configs to the objects 245# Read all Makefiles to map the configs to the objects
190foreach my $makefile (@makefiles) { 246foreach my $makefile (@makefiles) {
191 chomp $makefile; 247
248 my $cont = 0;
192 249
193 open(MIN,$makefile) || die "Can't open $makefile"; 250 open(MIN,$makefile) || die "Can't open $makefile";
194 while (<MIN>) { 251 while (<MIN>) {
@@ -215,7 +272,7 @@ foreach my $makefile (@makefiles) {
215 foreach my $obj (split /\s+/,$objs) { 272 foreach my $obj (split /\s+/,$objs) {
216 $obj =~ s/-/_/g; 273 $obj =~ s/-/_/g;
217 if ($obj =~ /(.*)\.o$/) { 274 if ($obj =~ /(.*)\.o$/) {
218 # Objects may bes enabled by more than one config. 275 # Objects may be enabled by more than one config.
219 # Store configs in an array. 276 # Store configs in an array.
220 my @arr; 277 my @arr;
221 278
@@ -237,8 +294,36 @@ foreach my $makefile (@makefiles) {
237 294
238my %modules; 295my %modules;
239 296
240# see what modules are loaded on this system 297if (defined($lsmod_file)) {
241open(LIN,"/sbin/lsmod|") || die "Cant lsmod"; 298 if ( ! -f $lsmod_file) {
299 die "$lsmod_file not found";
300 }
301 if ( -x $lsmod_file) {
302 # the file is executable, run it
303 open(LIN, "$lsmod_file|");
304 } else {
305 # Just read the contents
306 open(LIN, "$lsmod_file");
307 }
308} else {
309
310 # see what modules are loaded on this system
311 my $lsmod;
312
313 foreach my $dir ( ("/sbin", "/bin", "/usr/sbin", "/usr/bin") ) {
314 if ( -x "$dir/lsmod" ) {
315 $lsmod = "$dir/lsmod";
316 last;
317 }
318}
319 if (!defined($lsmod)) {
320 # try just the path
321 $lsmod = "lsmod";
322 }
323
324 open(LIN,"$lsmod|") || die "Can not call lsmod with $lsmod";
325}
326
242while (<LIN>) { 327while (<LIN>) {
243 next if (/^Module/); # Skip the first line. 328 next if (/^Module/); # Skip the first line.
244 if (/^(\S+)/) { 329 if (/^(\S+)/) {
@@ -252,7 +337,7 @@ close (LIN);
252my %configs; 337my %configs;
253foreach my $module (keys(%modules)) { 338foreach my $module (keys(%modules)) {
254 if (defined($objects{$module})) { 339 if (defined($objects{$module})) {
255 @arr = @{$objects{$module}}; 340 my @arr = @{$objects{$module}};
256 foreach my $conf (@arr) { 341 foreach my $conf (@arr) {
257 $configs{$conf} = $module; 342 $configs{$conf} = $module;
258 } 343 }
@@ -307,7 +392,7 @@ while ($repeat) {
307 parse_config_dep_select $depends{$config}; 392 parse_config_dep_select $depends{$config};
308 } 393 }
309 394
310 if (defined($prompt{$config}) || !defined($selects{$config})) { 395 if (defined($prompts{$config}) || !defined($selects{$config})) {
311 next; 396 next;
312 } 397 }
313 398