scanprov revision 1.1
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
17use strict;
18use Getopt::Long;
19
20require './parts/ppptools.pl';
21
22our %opt = (
23  mode    => 'check',
24  install => '/tmp/perl/install/default',
25  blead   => 'bleadperl',
26);
27
28GetOptions(\%opt, qw( install=s mode=s blead=s )) or die;
29
30my $write = $opt{mode} eq 'write';
31
32my %embed = map { ( $_->{name} => 1 ) }
33            parse_embed(qw(parts/embed.fnc parts/apidoc.fnc parts/ppport.fnc ));
34
35my @provided = grep { !exists $embed{$_} }
36               map { /^(\w+)/ ? $1 : () }
37               `$^X ppport.h --list-provided`;
38
39my @perls = sort { $b->{version} <=> $a->{version} }
40            map { { version => `$_ -e 'printf "%.6f", \$]'`, path => $_ } }
41            ($opt{blead}, glob "$opt{install}/*/bin/perl5.*");
42
43for (1 .. $#perls) {
44  $perls[$_]{todo} = $perls[$_-1]{version};
45}
46
47shift @perls;
48
49my %v;
50
51for my $p (@perls) {
52  print "checking perl $p->{version}...\n";
53  my $archlib = `$p->{path} -MConfig -l -e 'print \$Config{archlib}'`;
54  chomp $archlib;
55  local @ARGV = glob "$archlib/CORE/*.h";
56  my %sym;
57  while (<>) { $sym{$_}++ for /(\w+)/g; }
58  @provided = map { $sym{$_} or $v{$p->{todo}}{$_}++; $sym{$_} ? $_ : () } @provided;
59}
60
61my $out = 'parts/base';
62my $todo = parse_todo($out);
63
64for my $v (keys %v) {
65  my @new = sort grep { !exists $todo->{$_} } keys %{$v{$v}};
66  @new or next;
67  my $file = $v;
68  $file =~ s/\.//g;
69  $file = "$out/$file";
70  -e $file or die "non-existent: $file\n";
71  print "-- $file --\n";
72  $write and (open F, ">>$file" or die "$file: $!\n");
73  for (@new) {
74    print "adding $_\n";
75    $write and printf F "%-30s # added by $0\n", $_;
76  }
77  $write and close F;
78}
79