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