This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
6a16700ecdbc07db77b936dafd46762dbcd710c0
[perl5.git] / dist / Devel-PPPort / devel / scanprov
1 #!/usr/bin/perl -w
2 ################################################################################
3 #
4 #  scanprov -- scan Perl headers for provided macros
5 #
6 ################################################################################
7 #
8 #  Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
9 #  Version 2.x, Copyright (C) 2001, Paul Marquess.
10 #  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
11 #
12 #  This program is free software; you can redistribute it and/or
13 #  modify it under the same terms as Perl itself.
14 #
15 ################################################################################
16
17 use strict;
18 use Getopt::Long;
19
20 require './parts/ppptools.pl';
21 require './parts/inc/inctools';
22
23 our %opt = (
24   mode    => 'check',
25   install => '/tmp/perl/install/default',
26   blead   => 'bleadperl',
27 );
28
29 GetOptions(\%opt, qw( install=s mode=s blead=s )) or die;
30
31 my $write = $opt{mode} eq 'write';
32
33 my %embed = map { ( $_->{name} => 1 ) }
34             parse_embed(qw(parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc ));
35
36 my @provided = grep { !exists $embed{$_} }
37                map { /^(\w+)/ ? $1 : () }
38                `$^X ppport.h --list-provided`;
39
40 my @perls = sort { $b->{version} <=> $a->{version} }
41             map { { version => `$_ -e 'printf "%.6f", \$]'`, path => $_ } }
42             ($opt{blead}, glob "$opt{install}/*/bin/perl5.*");
43
44 for (1 .. $#perls) {
45   $perls[$_]{todo} = $perls[$_-1]{version};
46 }
47
48 shift @perls;
49
50 my %v;
51
52 for my $p (@perls) {
53   print "checking perl $p->{version}...\n";
54   my $archlib = `$p->{path} -MConfig -l -e 'print \$Config{archlib}'`;
55   chomp $archlib;
56   local @ARGV = glob "$archlib/CORE/*.h";
57   my %sym;
58   while (<>) { $sym{$_}++ for /(\w+)/g; }
59   @provided = map { $sym{$_} or $v{$p->{todo}}{$_}++; $sym{$_} ? $_ : () } @provided;
60 }
61
62 my $out = 'parts/base';
63 my $todo = parse_todo($out);
64
65 for my $v (keys %v) {
66   my @new = sort dictionary_order grep { !exists $todo->{$_} } keys %{$v{$v}};
67   @new or next;
68   my $file = $v;
69   $file =~ s/\.//g;
70   $file = "$out/$file";
71   -e $file or die "non-existent: $file\n";
72   print "-- $file --\n";
73   $write and (open F, ">>$file" or die "$file: $!\n");
74   for (@new) {
75     print "adding $_\n";
76     $write and printf F "%-30s # added by $0\n", $_;
77   }
78   $write and close F;
79 }