This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Move generation of ExtUtils::Miniperl to ext/ExtUtils-Miniperl from minimod.pl
[perl5.git] / ext / ExtUtils-Miniperl / Miniperl_pm.PL
1 #./miniperl -w
2 # minimod.pl writes the contents of miniperlmain.c into the module
3 # ExtUtils::Miniperl for later perusal (when the perl source is
4 # deleted)
5 #
6 # It also writes the subroutine writemain(), which takes as its
7 # arguments module names that shall be statically linked into perl.
8 #
9 # Authors: Andreas Koenig <k@franz.ww.TU-Berlin.DE>, Tim Bunce
10 #          <Tim.Bunce@ig.co.uk>
11 #
12 # Version 1.0, Feb 2nd 1995 by Andreas Koenig
13
14 use strict;
15
16 open STDOUT, '>Miniperl.pm'
17     or die "Can't open Miniperl.pm: $!";
18
19 print <<'END';
20 # This File keeps the contents of miniperlmain.c.
21 #
22 # It was generated automatically by minimod.PL from the contents
23 # of miniperlmain.c. Don't edit this file!
24 #
25 #       ANY CHANGES MADE HERE WILL BE LOST! 
26 #
27
28
29 package ExtUtils::Miniperl;
30 require Exporter;
31 @ISA = qw(Exporter);
32 @EXPORT = qw(&writemain);
33
34 $head= <<'EOF!HEAD';
35 END
36
37 open MINI, shift;
38 while (<MINI>) {
39     last if /Do not delete this line--writemain depends on it/;
40     print;
41     /#include "perl.h"/ and print qq/#include "XSUB.h"\n/;
42 }
43
44 print <<'END';
45 EOF!HEAD
46 $tail=<<'EOF!TAIL';
47 END
48
49 while (<MINI>) {
50     print unless /dXSUB_SYS/;
51 }
52 close MINI;
53
54 print <<'END';
55 EOF!TAIL
56
57 sub writemain{
58     my(@exts) = @_;
59
60     my($pname);
61     my($dl) = canon('/','DynaLoader');
62     print $head;
63
64     foreach $_ (@exts){
65         my($pname) = canon('/', $_);
66         my($mname, $cname);
67         ($mname = $pname) =~ s!/!::!g;
68         ($cname = $pname) =~ s!/!__!g;
69         print "EXTERN_C void boot_${cname} (pTHX_ CV* cv);\n";
70     }
71
72     my ($tail1,$tail2,$tail3) = ( $tail =~ /\A(.*{\s*\n)(.*\n)(\s*\}.*)\Z/s );
73
74     print $tail1;
75     print "\tstatic const char file[] = __FILE__;\n";
76     print "\tdXSUB_SYS;\n" if $] > 5.002;
77     print $tail2;
78
79     foreach $_ (@exts){
80         my($pname) = canon('/', $_);
81         my($mname, $cname, $ccode);
82         ($mname = $pname) =~ s!/!::!g;
83         ($cname = $pname) =~ s!/!__!g;
84         print "\t{\n";
85         if ($pname eq $dl){
86             # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
87             # boot_DynaLoader is called directly in DynaLoader.pm
88             $ccode = "\t/* DynaLoader is a special case */\n
89 \tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
90             print $ccode unless $SEEN{$ccode}++;
91         } else {
92             $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
93             print $ccode unless $SEEN{$ccode}++;
94         }
95         print "\t}\n";
96     }
97     print $tail3;
98 }
99
100 sub canon{
101     my($as, @ext) = @_;
102         foreach(@ext){
103             # might be X::Y or lib/auto/X/Y/Y.a
104                 next if s!::!/!g;
105             s:^(lib|ext)/(auto/)?::;
106             s:/\w+\.\w+$::;
107         }
108         grep(s:/:$as:, @ext) if ($as ne '/');
109         @ext;
110 }
111
112 1;
113 __END__
114
115 =head1 NAME
116
117 ExtUtils::Miniperl, writemain - write the C code for perlmain.c
118
119 =head1 SYNOPSIS
120
121 C<use ExtUtils::Miniperl;>
122
123 C<writemain(@directories);>
124
125 =head1 DESCRIPTION
126
127 This whole module is written when perl itself is built from a script
128 called minimod.PL. In case you want to patch it, please patch
129 minimod.PL in the perl distribution instead.
130
131 writemain() takes an argument list of directories containing archive
132 libraries that relate to perl modules and should be linked into a new
133 perl binary. It writes to STDOUT a corresponding perlmain.c file that
134 is a plain C file containing all the bootstrap code to make the
135 modules associated with the libraries available from within perl.
136
137 The typical usage is from within a Makefile generated by
138 ExtUtils::MakeMaker. So under normal circumstances you won't have to
139 deal with this module directly.
140
141 =head1 SEE ALSO
142
143 L<ExtUtils::MakeMaker>
144
145 =cut
146
147 END