Commit | Line | Data |
adfe19db |
1 | #!/usr/bin/perl -w |
2 | ################################################################################ |
3 | # |
4 | # scanprov -- scan Perl headers for provided macros |
5 | # |
6 | ################################################################################ |
7 | # |
9132e1a3 |
8 | # $Revision: 5 $ |
adfe19db |
9 | # $Author: mhx $ |
9132e1a3 |
10 | # $Date: 2005/01/31 08:10:50 +0100 $ |
adfe19db |
11 | # |
12 | ################################################################################ |
13 | # |
9132e1a3 |
14 | # Version 3.x, Copyright (C) 2004-2005, Marcus Holland-Moritz. |
adfe19db |
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 | |
a745474a |
26 | die "Usage: $0 [check|write]\n" unless @ARGV && $ARGV[0] =~ /^(check|write)$/; |
27 | my $mode = $1; |
adfe19db |
28 | |
29 | my %embed = map { ( $_->{name} => 1 ) } |
30 | parse_embed(qw(parts/embed.fnc parts/apidoc.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) { |
a745474a |
51 | print "checking perl $p->{version}...\n"; |
adfe19db |
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'; |
a745474a |
61 | my $todo = parse_todo($out); |
adfe19db |
62 | |
63 | for my $v (keys %v) { |
a745474a |
64 | my @new = sort grep { !exists $todo->{$_} } keys %{$v{$v}}; |
65 | @new or next; |
adfe19db |
66 | my $file = $v; |
67 | $file =~ s/\.//g; |
68 | $file = "$out/$file"; |
69 | -e $file or die "non-existent: $file\n"; |
a745474a |
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; |
adfe19db |
77 | } |