Hash :
574b20e5
Author :
Date :
2017-07-08T20:18:45
build: Inline perl prototypes in sources Prototypes allows us to avoid using the '&foo' invocation form when invoking a subroutine before its definition. Previously those prototypes were generated to prevent them from falling out-of-sync with actual definitions. Now we provide a 'check-perl-protos' lint script to ensure that this is not the case. This has the same benefits as generating prototypes while simplifying the bootstrap/build process. * bin/gen-perl-protos: Remove. * bin/Makefile.inc: Adapt. * bootstrap: Likewise. * bin/aclocal.in: Inline prototypes. * bin/automake.in: Likewise. * maintainer/check-perl-protos: New lint script. * maintainer/syntax-checks.mk (sc_perl_protos): New target. (syntax_check_rules): Add it.
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 46 47 48 49 50
#!/usr/bin/env perl
#
# Copyright (C) 2017 Free Software Foundation, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
use warnings;
use strict;
my @lines = <>;
my %forwards = map { /^sub (\w+)\s*\((.*)\);$/ ? ("$1" => "$2") : () } @lines;
my %subs = map { /^sub (\w+)\s*\((.*)\)$/ ? ("$1" => "$2") : () } @lines;
my $error_count = 0;
# $subs{"foo"} = "$$";
# $subs{"bar"} = "@";
# $forwards{"bar"} = "\$";
# Check that every subroutine has a matching forward declaration with
# the same prototype.
foreach my $sub (keys (%subs))
{
# XXX: The location of the subroutine is not reported.
if (grep { $sub eq $_ } keys (%forwards))
{
if ($forwards{$sub} ne $subs{$sub})
{
$error_count += 1;
warn ("prototype mismatch for \"$sub\" subroutine\n");
}
}
else
{
$error_count += 1;
warn ("missing prototype for \"$sub\" subroutine\n");
}
}
exit (($error_count == 0) ? 0 : 1);