| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 | |
| 19 | |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 | |
| 27 | |
| 28 | |
| 29 | |
| 30 | |
| 31 | |
| 32 | |
| 33 | |
| 34 | |
| 35 | |
| 36 | |
| 37 | |
| 38 | |
| 39 | |
| 40 | |
| 41 | |
| 42 | |
| 43 | |
| 44 | |
| 45 | use warnings;
|
| 46 | use strict;
|
| 47 | use Getopt::Long;
|
| 48 |
|
| 49 | |
| 50 | |
| 51 | my $debugprint = 0;
|
| 52 | $debugprint = 1 if (defined($ENV{LOCALMODCONFIG_DEBUG}));
|
| 53 |
|
| 54 | sub dprint {
|
| 55 | return if (!$debugprint);
|
| 56 | print STDERR @_;
|
| 57 | }
|
| 58 |
|
| 59 | my $uname = `uname -r`;
|
| 60 | chomp $uname;
|
| 61 |
|
| 62 | my @searchconfigs = (
|
| 63 | {
|
| 64 | "file" => ".config",
|
| 65 | "exec" => "cat",
|
| 66 | },
|
| 67 | {
|
| 68 | "file" => "/proc/config.gz",
|
| 69 | "exec" => "zcat",
|
| 70 | },
|
| 71 | {
|
| 72 | "file" => "/boot/config-$uname",
|
| 73 | "exec" => "cat",
|
| 74 | },
|
| 75 | {
|
| 76 | "file" => "/boot/vmlinuz-$uname",
|
| 77 | "exec" => "scripts/extract-ikconfig",
|
| 78 | "test" => "scripts/extract-ikconfig",
|
| 79 | },
|
| 80 | {
|
| 81 | "file" => "vmlinux",
|
| 82 | "exec" => "scripts/extract-ikconfig",
|
| 83 | "test" => "scripts/extract-ikconfig",
|
| 84 | },
|
| 85 | {
|
| 86 | "file" => "/lib/modules/$uname/kernel/kernel/configs.ko",
|
| 87 | "exec" => "scripts/extract-ikconfig",
|
| 88 | "test" => "scripts/extract-ikconfig",
|
| 89 | },
|
| 90 | {
|
| 91 | "file" => "kernel/configs.ko",
|
| 92 | "exec" => "scripts/extract-ikconfig",
|
| 93 | "test" => "scripts/extract-ikconfig",
|
| 94 | },
|
| 95 | {
|
| 96 | "file" => "kernel/configs.o",
|
| 97 | "exec" => "scripts/extract-ikconfig",
|
| 98 | "test" => "scripts/extract-ikconfig",
|
| 99 | },
|
| 100 | );
|
| 101 |
|
| 102 | sub read_config {
|
| 103 | foreach my $conf (@searchconfigs) {
|
| 104 | my $file = $conf->{"file"};
|
| 105 |
|
| 106 | next if ( ! -f "$file");
|
| 107 |
|
| 108 | if (defined($conf->{"test"})) {
|
| 109 | `$conf->{"test"} $conf->{"file"} 2>/dev/null`;
|
| 110 | next if ($?);
|
| 111 | }
|
| 112 |
|
| 113 | my $exec = $conf->{"exec"};
|
| 114 |
|
| 115 | print STDERR "using config: '$file'\n";
|
| 116 |
|
| 117 | open(my $infile, '-|', "$exec $file") || die "Failed to run $exec $file";
|
| 118 | my @x = <$infile>;
|
| 119 | close $infile;
|
| 120 | return @x;
|
| 121 | }
|
| 122 | die "No config file found";
|
| 123 | }
|
| 124 |
|
| 125 | my @config_file = read_config;
|
| 126 |
|
| 127 | |
| 128 | my $localmodconfig = 0;
|
| 129 | my $localyesconfig = 0;
|
| 130 |
|
| 131 | GetOptions("localmodconfig" => \$localmodconfig,
|
| 132 | "localyesconfig" => \$localyesconfig);
|
| 133 |
|
| 134 | |
| 135 | my $ksource = ($ARGV[0] ? $ARGV[0] : '.');
|
| 136 | my $kconfig = $ARGV[1];
|
| 137 | my $lsmod_file = $ENV{'LSMOD'};
|
| 138 |
|
| 139 | my @makefiles = `find $ksource -name Makefile -or -name Kbuild 2>/dev/null`;
|
| 140 | chomp @makefiles;
|
| 141 |
|
| 142 | my %depends;
|
| 143 | my %selects;
|
| 144 | my %prompts;
|
| 145 | my %objects;
|
| 146 | my %config2kfile;
|
| 147 | my %defaults;
|
| 148 | my $var;
|
| 149 | my $iflevel = 0;
|
| 150 | my @ifdeps;
|
| 151 |
|
| 152 | |
| 153 | my %read_kconfigs;
|
| 154 |
|
| 155 | sub read_kconfig {
|
| 156 | my ($kconfig) = @_;
|
| 157 |
|
| 158 | my $state = "NONE";
|
| 159 | my $config;
|
| 160 |
|
| 161 | my $cont = 0;
|
| 162 | my $line;
|
| 163 |
|
| 164 | my $source = "$ksource/$kconfig";
|
| 165 | my $last_source = "";
|
| 166 |
|
| 167 | |
| 168 | while ($source =~ /\$\((\w+)\)/ && $last_source ne $source) {
|
| 169 | my $env = $1;
|
| 170 | $last_source = $source;
|
| 171 | $source =~ s/\$\($env\)/$ENV{$env}/;
|
| 172 | }
|
| 173 |
|
| 174 | open(my $kinfile, '<', $source) || die "Can't open $source";
|
| 175 | while (<$kinfile>) {
|
| 176 | chomp;
|
| 177 |
|
| 178 | |
| 179 | if ($cont) {
|
| 180 | $_ = $line . " " . $_;
|
| 181 | }
|
| 182 |
|
| 183 | if (s/\\$//) {
|
| 184 | $cont = 1;
|
| 185 | $line = $_;
|
| 186 | next;
|
| 187 | }
|
| 188 |
|
| 189 | $cont = 0;
|
| 190 |
|
| 191 | |
| 192 | if (/^source\s+"?([^"]+)/) {
|
| 193 | my $kconfig = $1;
|
| 194 | |
| 195 | if (!defined($read_kconfigs{$kconfig})) {
|
| 196 | $read_kconfigs{$kconfig} = 1;
|
| 197 | read_kconfig($kconfig);
|
| 198 | }
|
| 199 | next;
|
| 200 | }
|
| 201 |
|
| 202 | |
| 203 | if (/^\s*(menu)?config\s+(\S+)\s*$/) {
|
| 204 | $state = "NEW";
|
| 205 | $config = $2;
|
| 206 | $config2kfile{"CONFIG_$config"} = $kconfig;
|
| 207 |
|
| 208 | |
| 209 | for (my $i = 0; $i < $iflevel; $i++) {
|
| 210 | if ($i) {
|
| 211 | $depends{$config} .= " " . $ifdeps[$i];
|
| 212 | } else {
|
| 213 | $depends{$config} = $ifdeps[$i];
|
| 214 | }
|
| 215 | $state = "DEP";
|
| 216 | }
|
| 217 |
|
| 218 | |
| 219 | } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
|
| 220 | $state = "DEP";
|
| 221 | $depends{$config} = $1;
|
| 222 | } elsif ($state eq "DEP" && /^\s*depends\s+on\s+(.*)$/) {
|
| 223 | $depends{$config} .= " " . $1;
|
| 224 | } elsif ($state ne "NONE" && /^\s*def(_(bool|tristate)|ault)\s+(\S.*)$/) {
|
| 225 | my $dep = $3;
|
| 226 | $defaults{$config} = 1;
|
| 227 | if ($dep !~ /^\s*(y|m|n)\s*$/) {
|
| 228 | $dep =~ s/.*\sif\s+//;
|
| 229 | $depends{$config} .= " " . $dep;
|
| 230 | dprint "Added default depends $dep to $config\n";
|
| 231 | }
|
| 232 |
|
| 233 | |
| 234 | } elsif ($state ne "NONE" && /^\s*select\s+(\S+)/) {
|
| 235 | my $conf = $1;
|
| 236 | if (defined($selects{$conf})) {
|
| 237 | $selects{$conf} .= " " . $config;
|
| 238 | } else {
|
| 239 | $selects{$conf} = $config;
|
| 240 | }
|
| 241 |
|
| 242 | |
| 243 | } elsif ($state ne "NONE" && /^\s*(tristate\s+\S|prompt\b)/) {
|
| 244 | |
| 245 | $prompts{$config} = 1;
|
| 246 |
|
| 247 | |
| 248 | } elsif (/^if\s+(.*\S)\s*$/) {
|
| 249 | my $deps = $1;
|
| 250 | |
| 251 | $deps =~ s/^[^a-zA-Z0-9_]*//;
|
| 252 | $deps =~ s/[^a-zA-Z0-9_]*$//;
|
| 253 |
|
| 254 | my @deps = split /[^a-zA-Z0-9_]+/, $deps;
|
| 255 |
|
| 256 | $ifdeps[$iflevel++] = join ':', @deps;
|
| 257 |
|
| 258 | } elsif (/^endif/) {
|
| 259 |
|
| 260 | $iflevel-- if ($iflevel);
|
| 261 |
|
| 262 | |
| 263 | } elsif (/^\s*(---)?help(---)?\s*$/ || /^(comment|choice|menu)\b/) {
|
| 264 | $state = "NONE";
|
| 265 | }
|
| 266 | }
|
| 267 | close($kinfile);
|
| 268 | }
|
| 269 |
|
| 270 | if ($kconfig) {
|
| 271 | read_kconfig($kconfig);
|
| 272 | }
|
| 273 |
|
| 274 | |
| 275 | sub convert_vars {
|
| 276 | my ($line, %vars) = @_;
|
| 277 |
|
| 278 | my $process = "";
|
| 279 |
|
| 280 | while ($line =~ s/^(.*?)(\$\((.*?)\))//) {
|
| 281 | my $start = $1;
|
| 282 | my $variable = $2;
|
| 283 | my $var = $3;
|
| 284 |
|
| 285 | if (defined($vars{$var})) {
|
| 286 | $process .= $start . $vars{$var};
|
| 287 | } else {
|
| 288 | $process .= $start . $variable;
|
| 289 | }
|
| 290 | }
|
| 291 |
|
| 292 | $process .= $line;
|
| 293 |
|
| 294 | return $process;
|
| 295 | }
|
| 296 |
|
| 297 | |
| 298 | foreach my $makefile (@makefiles) {
|
| 299 |
|
| 300 | my $line = "";
|
| 301 | my %make_vars;
|
| 302 |
|
| 303 | open(my $infile, '<', $makefile) || die "Can't open $makefile";
|
| 304 | while (<$infile>) {
|
| 305 | |
| 306 | chomp;
|
| 307 | if (/^(.*)\\$/) {
|
| 308 | $line .= $1;
|
| 309 | next;
|
| 310 | }
|
| 311 |
|
| 312 | $line .= $_;
|
| 313 | $_ = $line;
|
| 314 | $line = "";
|
| 315 |
|
| 316 | my $objs;
|
| 317 |
|
| 318 | |
| 319 | $_ = convert_vars($_, %make_vars);
|
| 320 |
|
| 321 | |
| 322 | if (/obj-\$[({](CONFIG_[^})]*)[)}]\s*[+:]?=\s*(.*)/) {
|
| 323 | $var = $1;
|
| 324 | $objs = $2;
|
| 325 |
|
| 326 | |
| 327 | } elsif (/^\s*(\S+)\s*[:]?=\s*(.*\S)/) {
|
| 328 | $make_vars{$1} = $2;
|
| 329 | }
|
| 330 | if (defined($objs)) {
|
| 331 | foreach my $obj (split /\s+/,$objs) {
|
| 332 | $obj =~ s/-/_/g;
|
| 333 | if ($obj =~ /(.*)\.o$/) {
|
| 334 | |
| 335 | |
| 336 | my @arr;
|
| 337 |
|
| 338 | if (defined($objects{$1})) {
|
| 339 | @arr = @{$objects{$1}};
|
| 340 | }
|
| 341 |
|
| 342 | $arr[$#arr+1] = $var;
|
| 343 |
|
| 344 | |
| 345 | |
| 346 | $objects{$1} = \@arr;
|
| 347 | }
|
| 348 | }
|
| 349 | }
|
| 350 | }
|
| 351 | close($infile);
|
| 352 | }
|
| 353 |
|
| 354 | my %modules;
|
| 355 | my $linfile;
|
| 356 |
|
| 357 | if (defined($lsmod_file)) {
|
| 358 | if ( ! -f $lsmod_file) {
|
| 359 | if ( -f $ENV{'objtree'}."/".$lsmod_file) {
|
| 360 | $lsmod_file = $ENV{'objtree'}."/".$lsmod_file;
|
| 361 | } else {
|
| 362 | die "$lsmod_file not found";
|
| 363 | }
|
| 364 | }
|
| 365 |
|
| 366 | my $otype = ( -x $lsmod_file) ? '-|' : '<';
|
| 367 | open($linfile, $otype, $lsmod_file);
|
| 368 |
|
| 369 | } else {
|
| 370 |
|
| 371 | |
| 372 | my $lsmod;
|
| 373 |
|
| 374 | foreach my $dir ( ("/sbin", "/bin", "/usr/sbin", "/usr/bin") ) {
|
| 375 | if ( -x "$dir/lsmod" ) {
|
| 376 | $lsmod = "$dir/lsmod";
|
| 377 | last;
|
| 378 | }
|
| 379 | }
|
| 380 | if (!defined($lsmod)) {
|
| 381 | |
| 382 | $lsmod = "lsmod";
|
| 383 | }
|
| 384 |
|
| 385 | open($linfile, '-|', $lsmod) || die "Can not call lsmod with $lsmod";
|
| 386 | }
|
| 387 |
|
| 388 | while (<$linfile>) {
|
| 389 | next if (/^Module/); |
| 390 | if (/^(\S+)/) {
|
| 391 | $modules{$1} = 1;
|
| 392 | }
|
| 393 | }
|
| 394 | close ($linfile);
|
| 395 |
|
| 396 | |
| 397 | |
| 398 | |
| 399 | my %configs;
|
| 400 | foreach my $module (keys(%modules)) {
|
| 401 | if (defined($objects{$module})) {
|
| 402 | my @arr = @{$objects{$module}};
|
| 403 | foreach my $conf (@arr) {
|
| 404 | $configs{$conf} = $module;
|
| 405 | dprint "$conf added by direct ($module)\n";
|
| 406 | if ($debugprint) {
|
| 407 | my $c=$conf;
|
| 408 | $c =~ s/^CONFIG_//;
|
| 409 | if (defined($depends{$c})) {
|
| 410 | dprint " deps = $depends{$c}\n";
|
| 411 | } else {
|
| 412 | dprint " no deps\n";
|
| 413 | }
|
| 414 | }
|
| 415 | }
|
| 416 | } else {
|
| 417 | |
| 418 | print STDERR "$module config not found!\n";
|
| 419 | }
|
| 420 | }
|
| 421 |
|
| 422 | |
| 423 | |
| 424 |
|
| 425 | my %orig_configs;
|
| 426 | my $valid = "A-Za-z_0-9";
|
| 427 |
|
| 428 | foreach my $line (@config_file) {
|
| 429 | $_ = $line;
|
| 430 |
|
| 431 | if (/(CONFIG_[$valid]*)=(m|y)/) {
|
| 432 | $orig_configs{$1} = $2;
|
| 433 | }
|
| 434 | }
|
| 435 |
|
| 436 | my $repeat = 1;
|
| 437 |
|
| 438 | my $depconfig;
|
| 439 |
|
| 440 | |
| 441 | |
| 442 | |
| 443 | |
| 444 | |
| 445 | |
| 446 | |
| 447 | |
| 448 | sub parse_config_depends
|
| 449 | {
|
| 450 | my ($p) = @_;
|
| 451 |
|
| 452 | while ($p =~ /[$valid]/) {
|
| 453 |
|
| 454 | if ($p =~ /^[^$valid]*([$valid]+)/) {
|
| 455 | my $conf = "CONFIG_" . $1;
|
| 456 |
|
| 457 | $p =~ s/^[^$valid]*[$valid]+//;
|
| 458 |
|
| 459 | |
| 460 | if (!defined($orig_configs{$conf}) || $orig_configs{$conf} eq "y") {
|
| 461 | next;
|
| 462 | }
|
| 463 |
|
| 464 | if (!defined($configs{$conf})) {
|
| 465 | |
| 466 | |
| 467 | $repeat = 1; |
| 468 | dprint "$conf selected by depend $depconfig\n";
|
| 469 | $configs{$conf} = 1;
|
| 470 | }
|
| 471 | } else {
|
| 472 | die "this should never happen";
|
| 473 | }
|
| 474 | }
|
| 475 | }
|
| 476 |
|
| 477 | |
| 478 | |
| 479 | |
| 480 | |
| 481 | |
| 482 | |
| 483 | |
| 484 | |
| 485 | |
| 486 | |
| 487 | sub parse_config_selects
|
| 488 | {
|
| 489 | my ($config, $p) = @_;
|
| 490 |
|
| 491 | my $next_config;
|
| 492 |
|
| 493 | while ($p =~ /[$valid]/) {
|
| 494 |
|
| 495 | if ($p =~ /^[^$valid]*([$valid]+)/) {
|
| 496 | my $conf = "CONFIG_" . $1;
|
| 497 |
|
| 498 | $p =~ s/^[^$valid]*[$valid]+//;
|
| 499 |
|
| 500 | |
| 501 | if (!defined($orig_configs{$conf})) {
|
| 502 | dprint "$conf not set for $config select\n";
|
| 503 | next;
|
| 504 | }
|
| 505 |
|
| 506 | |
| 507 | if (defined($orig_configs{$conf}) && $orig_configs{$conf} ne "m") {
|
| 508 | dprint "$conf (non module) selects $config, we are good\n";
|
| 509 | |
| 510 | return;
|
| 511 | }
|
| 512 | if (defined($configs{$conf})) {
|
| 513 | dprint "$conf selects $config so we are good\n";
|
| 514 | |
| 515 | return;
|
| 516 | }
|
| 517 | |
| 518 | if (!defined($next_config)) {
|
| 519 | $next_config = $conf;
|
| 520 | }
|
| 521 | } else {
|
| 522 | die "this should never happen";
|
| 523 | }
|
| 524 | }
|
| 525 |
|
| 526 | |
| 527 | if (!defined($next_config)) {
|
| 528 |
|
| 529 | |
| 530 | |
| 531 | |
| 532 | |
| 533 | if (!defined($defaults{$config})) {
|
| 534 | print STDERR "WARNING: $config is required, but nothing in the\n";
|
| 535 | print STDERR " current config selects it.\n";
|
| 536 | }
|
| 537 |
|
| 538 | return;
|
| 539 | }
|
| 540 |
|
| 541 | |
| 542 | |
| 543 | $repeat = 1;
|
| 544 | |
| 545 | $configs{$next_config} = 1;
|
| 546 | dprint "$next_config selected by select $config\n";
|
| 547 | }
|
| 548 |
|
| 549 | my %process_selects;
|
| 550 |
|
| 551 | |
| 552 | sub loop_depend {
|
| 553 | $repeat = 1;
|
| 554 |
|
| 555 | while ($repeat) {
|
| 556 | $repeat = 0;
|
| 557 |
|
| 558 | forloop:
|
| 559 | foreach my $config (keys %configs) {
|
| 560 |
|
| 561 | |
| 562 | if (defined($orig_configs{$config}) && $orig_configs{$config} ne "m") {
|
| 563 | next forloop;
|
| 564 | }
|
| 565 |
|
| 566 | $config =~ s/^CONFIG_//;
|
| 567 | $depconfig = $config;
|
| 568 |
|
| 569 | if (defined($depends{$config})) {
|
| 570 | |
| 571 | parse_config_depends $depends{$config};
|
| 572 | }
|
| 573 |
|
| 574 | |
| 575 | |
| 576 | if (!defined($prompts{$config}) && defined($selects{$config})) {
|
| 577 | $process_selects{$config} = 1;
|
| 578 | }
|
| 579 | }
|
| 580 | }
|
| 581 | }
|
| 582 |
|
| 583 | sub loop_select {
|
| 584 |
|
| 585 | foreach my $config (keys %process_selects) {
|
| 586 | $config =~ s/^CONFIG_//;
|
| 587 |
|
| 588 | dprint "Process select $config\n";
|
| 589 |
|
| 590 | |
| 591 | parse_config_selects $config, $selects{$config};
|
| 592 | }
|
| 593 | }
|
| 594 |
|
| 595 | while ($repeat) {
|
| 596 | |
| 597 | loop_depend;
|
| 598 |
|
| 599 | $repeat = 0;
|
| 600 |
|
| 601 | |
| 602 | loop_select;
|
| 603 | }
|
| 604 |
|
| 605 | my %setconfigs;
|
| 606 | my @preserved_kconfigs;
|
| 607 | if (defined($ENV{'LMC_KEEP'})) {
|
| 608 | @preserved_kconfigs = split(/:/,$ENV{LMC_KEEP});
|
| 609 | }
|
| 610 |
|
| 611 | sub in_preserved_kconfigs {
|
| 612 | my $kconfig = $config2kfile{$_[0]};
|
| 613 | if (!defined($kconfig)) {
|
| 614 | return 0;
|
| 615 | }
|
| 616 | foreach my $excl (@preserved_kconfigs) {
|
| 617 | if($kconfig =~ /^$excl/) {
|
| 618 | return 1;
|
| 619 | }
|
| 620 | }
|
| 621 | return 0;
|
| 622 | }
|
| 623 |
|
| 624 | |
| 625 | |
| 626 | foreach my $line (@config_file) {
|
| 627 | $_ = $line;
|
| 628 |
|
| 629 | if (/CONFIG_IKCONFIG/) {
|
| 630 | if (/# CONFIG_IKCONFIG is not set/) {
|
| 631 | |
| 632 | print "CONFIG_IKCONFIG=m\n";
|
| 633 | |
| 634 | print "# CONFIG_IKCONFIG_PROC is not set\n";
|
| 635 | } else {
|
| 636 | print;
|
| 637 | }
|
| 638 | next;
|
| 639 | }
|
| 640 |
|
| 641 | if (/CONFIG_MODULE_SIG_KEY="(.+)"/) {
|
| 642 | my $orig_cert = $1;
|
| 643 | my $default_cert = "certs/signing_key.pem";
|
| 644 |
|
| 645 | |
| 646 | if (!defined($depends{"MODULE_SIG_KEY"}) ||
|
| 647 | $depends{"MODULE_SIG_KEY"} !~ /"\Q$default_cert\E"/) {
|
| 648 | print STDERR "WARNING: MODULE_SIG_KEY assertion failure, ",
|
| 649 | "update needed to ", __FILE__, " line ", __LINE__, "\n";
|
| 650 | print;
|
| 651 | } elsif ($orig_cert ne $default_cert && ! -f $orig_cert) {
|
| 652 | print STDERR "Module signature verification enabled but ",
|
| 653 | "module signing key \"$orig_cert\" not found. Resetting ",
|
| 654 | "signing key to default value.\n";
|
| 655 | print "CONFIG_MODULE_SIG_KEY=\"$default_cert\"\n";
|
| 656 | } else {
|
| 657 | print;
|
| 658 | }
|
| 659 | next;
|
| 660 | }
|
| 661 |
|
| 662 | if (/CONFIG_SYSTEM_TRUSTED_KEYS="(.+)"/) {
|
| 663 | my $orig_keys = $1;
|
| 664 |
|
| 665 | if (! -f $orig_keys) {
|
| 666 | print STDERR "System keyring enabled but keys \"$orig_keys\" ",
|
| 667 | "not found. Resetting keys to default value.\n";
|
| 668 | print "CONFIG_SYSTEM_TRUSTED_KEYS=\"\"\n";
|
| 669 | } else {
|
| 670 | print;
|
| 671 | }
|
| 672 | next;
|
| 673 | }
|
| 674 |
|
| 675 | if (/^(CONFIG.*)=(m|y)/) {
|
| 676 | if (in_preserved_kconfigs($1)) {
|
| 677 | dprint "Preserve config $1";
|
| 678 | print;
|
| 679 | next;
|
| 680 | }
|
| 681 | if (defined($configs{$1})) {
|
| 682 | if ($localyesconfig) {
|
| 683 | $setconfigs{$1} = 'y';
|
| 684 | print "$1=y\n";
|
| 685 | next;
|
| 686 | } else {
|
| 687 | $setconfigs{$1} = $2;
|
| 688 | }
|
| 689 | } elsif ($2 eq "m") {
|
| 690 | print "# $1 is not set\n";
|
| 691 | next;
|
| 692 | }
|
| 693 | }
|
| 694 | print;
|
| 695 | }
|
| 696 |
|
| 697 | |
| 698 | |
| 699 | loop:
|
| 700 | foreach my $module (keys(%modules)) {
|
| 701 | if (defined($objects{$module})) {
|
| 702 | my @arr = @{$objects{$module}};
|
| 703 | foreach my $conf (@arr) {
|
| 704 | if (defined($setconfigs{$conf})) {
|
| 705 | next loop;
|
| 706 | }
|
| 707 | }
|
| 708 | print STDERR "module $module did not have configs";
|
| 709 | foreach my $conf (@arr) {
|
| 710 | print STDERR " " , $conf;
|
| 711 | }
|
| 712 | print STDERR "\n";
|
| 713 | }
|
| 714 | }
|
| 715 |
|
| 716 | |