60caf38e0d29528e13b59a2861c8ccf81bdfe84e
[perl.git] / ext / Encode / Byte / Makefile.PL
1 use 5.7.2;
2 use strict;
3 use ExtUtils::MakeMaker;
4 use File::Spec::Functions;
5
6 my $name = 'Byte';
7 my %tables = (
8           byte_t => 
9           [
10            # misc. vendors
11            # 'gsm0338.ucm', now in Encode::GSM0338
12            'nextstep.ucm',
13            'hp-roman8.ucm',
14            'viscii.ucm',
15            'adobeStdenc.ucm',
16            # koi8
17            'koi8-f.ucm', 'koi8-r.ucm', 'koi8-u.ucm', 
18            # Mac
19            qw(
20           macArabic.ucm
21           macCentEuro.ucm
22           macCroatian.ucm
23           macCyrillic.ucm
24           macFarsi.ucm
25           macGreek.ucm
26           macHebrew.ucm
27           macIceland.ucm
28           macRoman.ucm
29           macROMnn.ucm
30           macRUMnn.ucm
31           macSami.ucm
32           macThai.ucm
33           macTurkish.ucm
34           macUkraine.ucm
35           ),
36           ],
37              );
38
39 my %not_here = 
40     map {$_ => 1} 
41 (
42  '8859-1.ucm', # default
43  qw(cp037.ucm cp1026.ucm cp1047.ucm cp500.ucm cp875.ucm), # EBCDIC
44  qw(cp932.ucm cp936.ucm cp949.ucm cp950.ucm),  # CJK
45  );
46
47 opendir(ENC,catdir(updir(),'ucm')) or die $!;
48 while (defined(my $file = readdir(ENC)))
49 {
50     $file =~ /^(8859|cp).*\.ucm$/io or next;
51     $not_here{$file} and next;
52     push(@{$tables{byte_t}},$file);
53 }
54 closedir(ENC);
55
56 WriteMakefile(
57               INC               => "-I../Encode",
58           NAME          => 'Encode::'.$name,
59           VERSION_FROM  => "$name.pm",
60           OBJECT                => '$(O_FILES)',
61           'dist'                => {
62           COMPRESS      => 'gzip -9f',
63           SUFFIX        => 'gz',
64           DIST_DEFAULT => 'all tardist',
65           },
66           MAN3PODS      => {},
67           # OS 390 winges about line numbers > 64K ???
68           XSOPT => '-nolinenumbers',
69           );
70
71 package MY;
72
73 sub post_initialize
74 {
75     my ($self) = @_;
76     my %o;
77     my $x = $self->{'OBJ_EXT'};
78     # Add the table O_FILES
79     foreach my $e (keys %tables)
80     {
81     $o{$e.$x} = 1;
82     }
83     $o{"$name$x"} = 1;
84     $self->{'O_FILES'} = [sort keys %o];
85     my @files = ("$name.xs");
86     $self->{'C'} = ["$name.c"];
87     $self->{SOURCE} .= " $name.c"
88         if $^O eq 'MacOS' && $self->{SOURCE} !~ /\b$name\.c\b/;
89     $self->{'H'} = [$self->catfile($self->updir,'Encode', 'encode.h')];
90     my %xs;
91     foreach my $table (keys %tables) {
92     push (@{$self->{'C'}},"$table.c");
93     # Do NOT add $table.h etc. to H_FILES unless we own up as to how they
94     # get built.
95     foreach my $ext (qw($(OBJ_EXT) .c .h .exh .fnm)) {
96         push (@files,$table.$ext);
97     }
98     $self->{SOURCE} .= " $table.c"
99         if $^O eq 'MacOS' && $self->{SOURCE} !~ /\b$table\.c\b/;
100     }
101     $self->{'XS'} = { "$name.xs" => "$name.c" };
102     $self->{'clean'}{'FILES'} .= join(' ',@files);
103     open(XS,">$name.xs") || die "Cannot open $name.xs:$!";
104     print XS <<'END';
105 #include <EXTERN.h>
106 #include <perl.h>
107 #include <XSUB.h>
108 #define U8 U8
109 #include "encode.h"
110 END
111     foreach my $table (keys %tables) {
112     print XS qq[#include "${table}.h"\n];
113     }
114     print XS <<"END";
115
116 static void
117 Encode_XSEncoding(pTHX_ encode_t *enc)
118 {
119  dSP;
120  HV *stash = gv_stashpv("Encode::XS", TRUE);
121  SV *sv    = sv_bless(newRV_noinc(newSViv(PTR2IV(enc))),stash);
122  int i = 0;
123  PUSHMARK(sp);
124  XPUSHs(sv);
125  while (enc->name[i])
126   {
127    const char *name = enc->name[i++];
128    XPUSHs(sv_2mortal(newSVpvn(name,strlen(name))));
129   }
130  PUTBACK;
131  call_pv("Encode::define_encoding",G_DISCARD);
132  SvREFCNT_dec(sv);
133 }
134
135 MODULE = Encode::$name  PACKAGE = Encode::$name
136 PROTOTYPES: DISABLE
137 BOOT:
138 {
139 END
140     foreach my $table (keys %tables) {
141     print XS qq[#include "${table}.exh"\n];
142     }
143     print XS "}\n";
144     close(XS);
145     return "# Built $name.xs\n\n";
146 }
147
148 sub postamble
149 {
150     my $self = shift;
151     my $dir  = $self->catdir($self->updir,'ucm');
152     my $str  = "# $name\$(OBJ_EXT) depends on .h and .exh files not .c files - but all written by enc2xs\n";
153     $str    .= "$name.c : $name.xs ";
154     foreach my $table (keys %tables)
155     {
156     $str .= " $table.c";
157     }
158     $str .= "\n\n";
159     $str .= "$name\$(OBJ_EXT) : $name.c\n\n";
160
161     my $enc2xs = $self->catfile($self->updir,'bin', 'enc2xs');
162     foreach my $table (keys %tables)
163     {
164     my $numlines = 1;
165     my $lengthsofar = length($str);
166     my $continuator = '';
167     $str .= "$table.c : $enc2xs Makefile.PL";
168     foreach my $file (@{$tables{$table}})
169     {
170         $str .= $continuator.' '.$self->catfile($dir,$file);
171         if ( length($str)-$lengthsofar > 128*$numlines )
172         {
173         $continuator .= " \\\n\t";
174         $numlines++;
175         } else {
176         $continuator = '';
177         }
178     }
179     my $plib   = $self->{PERL_CORE} ? '"-I$(PERL_LIB)"' : '';
180     $plib .= " -MCross=$::Cross::platform" if defined $::Cross::platform;
181     my $ucopts = '-"Q" -"O"';
182     $str .=  
183         qq{\n\t\$(PERL) $plib $enc2xs $ucopts -o \$\@ -f $table.fnm\n\n};
184     open (FILELIST, ">$table.fnm")
185         || die "Could not open $table.fnm: $!";
186     foreach my $file (@{$tables{$table}})
187     {
188         print FILELIST $self->catfile($dir,$file) . "\n";
189     }
190     close(FILELIST);
191     }
192     return $str;
193 }
194