Commit | Line | Data |
---|---|---|
fed7345c AD |
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; | |
4633a7c4 LW |
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 | ||
fed7345c AD |
68 | print " char *file = __FILE__;\n"; |
69 | foreach $_ (@exts){ | |
70 | my($pname) = canon('/', $_); | |
8e07c86e | 71 | my($mname, $cname, $ccode); |
fed7345c AD |
72 | ($mname = $pname) =~ s!/!::!g; |
73 | ($cname = $pname) =~ s!/!__!g; | |
4633a7c4 | 74 | print "\t{\n"; |
fed7345c AD |
75 | if ($pname eq $dl){ |
76 | # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'! | |
77 | # boot_DynaLoader is called directly in DynaLoader.pm | |
8e07c86e AD |
78 | $ccode = "\t/* DynaLoader is a special case */\n |
79 | \tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n"; | |
80 | print $ccode unless $SEEN{$ccode}++; | |
fed7345c | 81 | } else { |
8e07c86e AD |
82 | $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n"; |
83 | print $ccode unless $SEEN{$ccode}++; | |
fed7345c AD |
84 | } |
85 | print "\t}\n"; | |
86 | } | |
4633a7c4 | 87 | print $tail2; |
fed7345c AD |
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; | |
864a5fa8 | 103 | __END__ |
222dd4a0 | 104 | |
864a5fa8 AD |
105 | =head1 NAME |
106 | ||
222dd4a0 | 107 | ExtUtils::Miniperl, writemain - write the C code for perlmain.c |
864a5fa8 AD |
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 | ||
fed7345c | 137 | END |