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