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