1use 5.7.2;
2use strict;
3use ExtUtils::MakeMaker;
4use File::Spec::Functions;
5
6my $name = 'Byte';
7my %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
39my %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
47opendir(ENC,catdir(updir(),'ucm')) or die $!;
48while (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}
54closedir(ENC);
55
56WriteMakefile(
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
71package MY;
72
73sub 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#include "encode.h"
109END
110    foreach my $table (sort keys %tables) {
111    print XS qq[#include "${table}.h"\n];
112    }
113    print XS <<"END";
114
115static void
116Encode_XSEncoding(pTHX_ encode_t *enc)
117{
118 dSP;
119 HV *stash = gv_stashpv("Encode::XS", TRUE);
120 SV *iv    = newSViv(PTR2IV(enc));
121 SV *sv    = sv_bless(newRV_noinc(iv),stash);
122 int i = 0;
123 /* with the SvLEN() == 0 hack, PVX won't be freed. We cast away name's
124 constness, in the hope that perl won't mess with it. */
125 assert(SvTYPE(iv) >= SVt_PV); assert(SvLEN(iv) == 0);
126 SvFLAGS(iv) |= SVp_POK;
127 SvPVX(iv) = (char*) enc->name[0];
128 PUSHMARK(sp);
129 XPUSHs(sv);
130 while (enc->name[i])
131  {
132   const char *name = enc->name[i++];
133   XPUSHs(sv_2mortal(newSVpvn(name,strlen(name))));
134  }
135 PUTBACK;
136 call_pv("Encode::define_encoding",G_DISCARD);
137 SvREFCNT_dec(sv);
138}
139
140MODULE = Encode::$name	PACKAGE = Encode::$name
141PROTOTYPES: DISABLE
142BOOT:
143{
144END
145    foreach my $table (sort keys %tables) {
146    print XS qq[#include "${table}.exh"\n];
147    }
148    print XS "}\n";
149    close(XS);
150    return "# Built $name.xs\n\n";
151}
152
153sub postamble
154{
155    my $self = shift;
156    my $dir  = $self->catdir($self->updir,'ucm');
157    my $str  = "# $name\$(OBJ_EXT) depends on .h and .exh files not .c files - but all written by enc2xs\n";
158    $str    .= "$name.c : $name.xs ";
159    foreach my $table (keys %tables)
160    {
161    $str .= " $table.c";
162    }
163    $str .= "\n\n";
164    $str .= "$name\$(OBJ_EXT) : $name.c\n\n";
165
166    my $enc2xs = $self->catfile($self->updir,'bin', 'enc2xs');
167    foreach my $table (keys %tables)
168    {
169    my $numlines = 1;
170    my $lengthsofar = length($str);
171    my $continuator = '';
172    $str .= "$table.c : $enc2xs Makefile.PL";
173    foreach my $file (@{$tables{$table}})
174    {
175        $str .= $continuator.' '.$self->catfile($dir,$file);
176        if ( length($str)-$lengthsofar > 128*$numlines )
177        {
178        $continuator .= " \\\n\t";
179        $numlines++;
180        } else {
181        $continuator = '';
182        }
183    }
184    my $plib   = $self->{PERL_CORE} ? '"-I$(PERL_LIB)"' : '';
185    $plib .= " -MCross=$::Cross::platform" if defined $::Cross::platform;
186    my $ucopts = '-"Q" -"O"';
187    $str .=
188        qq{\n\t\$(PERL) $plib $enc2xs $ucopts -o \$\@ -f $table.fnm\n\n};
189    open (FILELIST, ">$table.fnm")
190        || die "Could not open $table.fnm: $!";
191    foreach my $file (@{$tables{$table}})
192    {
193        print FILELIST $self->catfile($dir,$file) . "\n";
194    }
195    close(FILELIST);
196    }
197    return $str;
198}
199
200