perl script to check for references to unknown Kconfig macros

Josh Boyer jwboyer at fedoraproject.org
Thu Oct 2 12:41:10 UTC 2014


On Thu, Oct 2, 2014 at 4:49 AM, Paul Bolle <pebolle at tiscali.nl> wrote:
> Josh,
>
> Here's a perl script I cobbled together that checks for references to
> unknown Kconfig macros. Tested on top of current master. Invoke like
> this:
>     perl "$WHAT_SHALL_I_CALL_THIS.pl" $SOME_DIR/kernel-3.16.fc20/linux-3.17.0-0.rc7.git1.1.fc20.x86_64
>
> (I stopped tracking rawhide long ago.)
>
> I'll send a patch generated with the aid of this script shortly.
>
> It seems overkill to invoke (something like) this every build. But
> perhaps the package maintainers can include (something like) it before
> they push changes into master.

I would imagine it being most useful during the merge window kernels.
Perhaps running it once per -rc build would be sufficient to keep
things clean.

> The call of "glob("config-*")" is an accident waiting to happen, but I
> couldn't be bothered to replace it with a call of "git ls-files
> "config-*"".
>
> Have fun!

If you have no objections, I'll likely add this to the scripts/
directory in the kernel pkg repo.  That way it's there and people that
can actually read perl can modify it, etc.  Have a preference on a
name?  I was thinking "zombie_kconfig.pl".

josh

>
>
> Paul Bolle
>
> # By Paul Bolle October 2014.
> #
> # Contributed to the public domain by its author.
>
> use 5.016;
> use warnings;
> use autodie;
>
> use File::Find;
>
> my @Kconfigs;
>
> my $Kconfigre = qr/Kconfig.*/;
> my $configre = qr/^\s*(menu)?config\s+(?<config>(\w+))$/;
> my $CONFIG_re = qr/\bCONFIG_(?<CONFIG_>(\w+))/;
>
> sub match {
>         push( @Kconfigs, $File::Find::name ) if ($_ =~ $Kconfigre);
> }
>
> sub parse_kconfig {
>         my ($path) = @_;
>
>         my @ret;
>
>         open( my $kconfig, "<", $path );
>         my $slurp = do { local $/ = undef; <$kconfig> };
>         close( $kconfig );
>         my @lines = split ( /\n/, $slurp );
>         foreach my $line (@lines) {
>                 if ($line =~ /$configre/) {
>                         push( @ret, $+{config} );
>                 }
>         }
>
>         @ret;
> }
>
> sub parse_shipped {
>         my ($path) = @_;
>
>         my @ret;
>
>         open( my $shipped, "<", $path );
>         my $slurp = do { local $/ = undef; <$shipped> };
>         close( $shipped );
>         my @lines = split ( /\n/, $slurp );
>         my $i = 1;
>         foreach my $line (@lines) {
>                 if ($line =~ /$CONFIG_re/) {
>                         push( @ret, [$i, $+{CONFIG_}] );
>                 }
>                 $i++;
>         }
>
>         @ret;
> }
>
> exit main ( @ARGV );
>
> sub main {
>         my %configs;
>
>         find( \&match, @_ );
>
>         foreach my $Kconfig (@Kconfigs) {
>                 my (@tmp) = parse_kconfig( $Kconfig );
>                 foreach my $config ( @tmp ) {
>                         $configs{ $config }++;
>                 }
>         }
>
>         foreach my $shipped (glob("config-*")) {
>                 my (@tmp) = parse_shipped( $shipped );
>                 foreach my $ref ( @tmp ) {
>                         say( STDERR "$shipped:$ref->[0]: No Kconfig symbol matches 'CONFIG_$ref->[1]'" )
>                                 unless (grep( /$ref->[1]/, keys( %configs )));
>                 }
>         }
>
>         0;
> }
>


More information about the kernel mailing list