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