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