Blame Byte/Makefile.PL

Packit d0f5c2
use 5.7.2;
Packit d0f5c2
use strict;
Packit d0f5c2
use ExtUtils::MakeMaker;
Packit d0f5c2
use File::Spec::Functions;
Packit d0f5c2
Packit d0f5c2
my $name = 'Byte';
Packit d0f5c2
my %tables = (
Packit d0f5c2
          byte_t => 
Packit d0f5c2
          [
Packit d0f5c2
           # misc. vendors
Packit d0f5c2
           # 'gsm0338.ucm', now in Encode::GSM0338
Packit d0f5c2
           'nextstep.ucm',
Packit d0f5c2
           'hp-roman8.ucm',
Packit d0f5c2
           'viscii.ucm',
Packit d0f5c2
           'adobeStdenc.ucm',
Packit d0f5c2
           # koi8
Packit d0f5c2
           'koi8-f.ucm', 'koi8-r.ucm', 'koi8-u.ucm', 
Packit d0f5c2
           # Mac
Packit d0f5c2
           qw(
Packit d0f5c2
          macArabic.ucm
Packit d0f5c2
          macCentEuro.ucm
Packit d0f5c2
          macCroatian.ucm
Packit d0f5c2
          macCyrillic.ucm
Packit d0f5c2
          macFarsi.ucm
Packit d0f5c2
          macGreek.ucm
Packit d0f5c2
          macHebrew.ucm
Packit d0f5c2
          macIceland.ucm
Packit d0f5c2
          macRoman.ucm
Packit d0f5c2
          macROMnn.ucm
Packit d0f5c2
          macRUMnn.ucm
Packit d0f5c2
          macSami.ucm
Packit d0f5c2
          macThai.ucm
Packit d0f5c2
          macTurkish.ucm
Packit d0f5c2
          macUkraine.ucm
Packit d0f5c2
          ),
Packit d0f5c2
          ],
Packit d0f5c2
             );
Packit d0f5c2
Packit d0f5c2
my %not_here = 
Packit d0f5c2
    map {$_ => 1} 
Packit d0f5c2
(
Packit d0f5c2
 '8859-1.ucm', 'cp1252.ucm', # default
Packit d0f5c2
 qw(cp037.ucm cp1026.ucm cp1047.ucm cp500.ucm cp875.ucm), # EBCDIC
Packit d0f5c2
 qw(cp932.ucm cp936.ucm cp949.ucm cp950.ucm),  # CJK
Packit d0f5c2
 );
Packit d0f5c2
Packit d0f5c2
opendir(ENC,catdir(updir(),'ucm')) or die $!;
Packit d0f5c2
while (defined(my $file = readdir(ENC)))
Packit d0f5c2
{
Packit d0f5c2
    $file =~ /^(8859|cp).*\.ucm$/io or next;
Packit d0f5c2
    $not_here{$file} and next;
Packit d0f5c2
    push(@{$tables{byte_t}},$file);
Packit d0f5c2
}
Packit d0f5c2
closedir(ENC);
Packit d0f5c2
Packit d0f5c2
WriteMakefile(
Packit d0f5c2
              INC		=> "-I../Encode",
Packit d0f5c2
          NAME		=> 'Encode::'.$name,
Packit d0f5c2
          VERSION_FROM	=> "$name.pm",
Packit d0f5c2
          OBJECT		=> '$(O_FILES)',
Packit d0f5c2
          'dist'		=> {
Packit d0f5c2
          COMPRESS	=> 'gzip -9f',
Packit d0f5c2
          SUFFIX	=> 'gz',
Packit d0f5c2
          DIST_DEFAULT => 'all tardist',
Packit d0f5c2
          },
Packit d0f5c2
          MAN3PODS	=> {},
Packit d0f5c2
          # OS 390 winges about line numbers > 64K ???
Packit d0f5c2
          XSOPT => '-nolinenumbers',
Packit d0f5c2
          );
Packit d0f5c2
Packit d0f5c2
package MY;
Packit d0f5c2
Packit d0f5c2
sub post_initialize
Packit d0f5c2
{
Packit d0f5c2
    my ($self) = @_;
Packit d0f5c2
    my %o;
Packit d0f5c2
    my $x = $self->{'OBJ_EXT'};
Packit d0f5c2
    # Add the table O_FILES
Packit d0f5c2
    foreach my $e (keys %tables)
Packit d0f5c2
    {
Packit d0f5c2
    $o{$e.$x} = 1;
Packit d0f5c2
    }
Packit d0f5c2
    $o{"$name$x"} = 1;
Packit d0f5c2
    $self->{'O_FILES'} = [sort keys %o];
Packit d0f5c2
    my @files = ("$name.xs");
Packit d0f5c2
    $self->{'C'} = ["$name.c"];
Packit d0f5c2
    $self->{SOURCE} .= " $name.c"
Packit d0f5c2
        if $^O eq 'MacOS' && $self->{SOURCE} !~ /\b$name\.c\b/;
Packit d0f5c2
    $self->{'H'} = [$self->catfile($self->updir,'Encode', 'encode.h')];
Packit d0f5c2
    my %xs;
Packit d0f5c2
    foreach my $table (sort keys %tables) {
Packit d0f5c2
    push (@{$self->{'C'}},"$table.c");
Packit d0f5c2
    # Do NOT add $table.h etc. to H_FILES unless we own up as to how they
Packit d0f5c2
    # get built.
Packit d0f5c2
    foreach my $ext (qw($(OBJ_EXT) .c .h .exh .fnm)) {
Packit d0f5c2
        push (@files,$table.$ext);
Packit d0f5c2
    }
Packit d0f5c2
    $self->{SOURCE} .= " $table.c"
Packit d0f5c2
        if $^O eq 'MacOS' && $self->{SOURCE} !~ /\b$table\.c\b/;
Packit d0f5c2
    }
Packit d0f5c2
    $self->{'XS'} = { "$name.xs" => "$name.c" };
Packit d0f5c2
    $self->{'clean'}{'FILES'} .= join(' ',@files);
Packit d0f5c2
    open(XS,">$name.xs") || die "Cannot open $name.xs:$!";
Packit d0f5c2
    print XS <<'END';
Packit d0f5c2
#define PERL_NO_GET_CONTEXT
Packit d0f5c2
#include <EXTERN.h>
Packit d0f5c2
#include <perl.h>
Packit d0f5c2
#include <XSUB.h>
Packit d0f5c2
#include "encode.h"
Packit d0f5c2
END
Packit d0f5c2
    foreach my $table (sort keys %tables) {
Packit d0f5c2
    print XS qq[#include "${table}.h"\n];
Packit d0f5c2
    }
Packit d0f5c2
    print XS <<"END";
Packit d0f5c2
Packit d0f5c2
static void
Packit d0f5c2
Encode_XSEncoding(pTHX_ encode_t *enc)
Packit d0f5c2
{
Packit d0f5c2
 dSP;
Packit d0f5c2
 HV *stash = gv_stashpv("Encode::XS", TRUE);
Packit d0f5c2
 SV *iv    = newSViv(PTR2IV(enc));
Packit d0f5c2
 SV *sv    = sv_bless(newRV_noinc(iv),stash);
Packit d0f5c2
 int i = 0;
Packit d0f5c2
 /* with the SvLEN() == 0 hack, PVX won't be freed. We cast away name's
Packit d0f5c2
 constness, in the hope that perl won't mess with it. */
Packit d0f5c2
 assert(SvTYPE(iv) >= SVt_PV); assert(SvLEN(iv) == 0);
Packit d0f5c2
 SvFLAGS(iv) |= SVp_POK;
Packit d0f5c2
 SvPVX(iv) = (char*) enc->name[0];
Packit d0f5c2
 PUSHMARK(sp);
Packit d0f5c2
 XPUSHs(sv);
Packit d0f5c2
 while (enc->name[i])
Packit d0f5c2
  {
Packit d0f5c2
   const char *name = enc->name[i++];
Packit d0f5c2
   XPUSHs(sv_2mortal(newSVpvn(name,strlen(name))));
Packit d0f5c2
  }
Packit d0f5c2
 PUTBACK;
Packit d0f5c2
 call_pv("Encode::define_encoding",G_DISCARD);
Packit d0f5c2
 SvREFCNT_dec(sv);
Packit d0f5c2
}
Packit d0f5c2
Packit d0f5c2
MODULE = Encode::$name	PACKAGE = Encode::$name
Packit d0f5c2
PROTOTYPES: DISABLE
Packit d0f5c2
BOOT:
Packit d0f5c2
{
Packit d0f5c2
END
Packit d0f5c2
    foreach my $table (sort keys %tables) {
Packit d0f5c2
    print XS qq[#include "${table}.exh"\n];
Packit d0f5c2
    }
Packit d0f5c2
    print XS "}\n";
Packit d0f5c2
    close(XS);
Packit d0f5c2
    return "# Built $name.xs\n\n";
Packit d0f5c2
}
Packit d0f5c2
Packit d0f5c2
sub postamble
Packit d0f5c2
{
Packit d0f5c2
    my $self = shift;
Packit d0f5c2
    my $dir  = $self->catdir($self->updir,'ucm');
Packit d0f5c2
    my $str  = "# $name\$(OBJ_EXT) depends on .h and .exh files not .c files - but all written by enc2xs\n";
Packit d0f5c2
    $str    .= "$name.c : $name.xs ";
Packit d0f5c2
    foreach my $table (sort keys %tables)
Packit d0f5c2
    {
Packit d0f5c2
    $str .= " $table.c";
Packit d0f5c2
    }
Packit d0f5c2
    $str .= "\n\n";
Packit d0f5c2
    $str .= "$name\$(OBJ_EXT) : $name.c\n\n";
Packit d0f5c2
Packit d0f5c2
    my $enc2xs = $self->catfile($self->updir,'bin', 'enc2xs');
Packit d0f5c2
    foreach my $table (sort keys %tables)
Packit d0f5c2
    {
Packit d0f5c2
    my $numlines = 1;
Packit d0f5c2
    my $lengthsofar = length($str);
Packit d0f5c2
    my $continuator = '';
Packit d0f5c2
    $str .= "$table.c : $enc2xs Makefile.PL";
Packit d0f5c2
    foreach my $file (@{$tables{$table}})
Packit d0f5c2
    {
Packit d0f5c2
        $str .= $continuator.' '.$self->catfile($dir,$file);
Packit d0f5c2
        if ( length($str)-$lengthsofar > 128*$numlines )
Packit d0f5c2
        {
Packit d0f5c2
        $continuator .= " \\\n\t";
Packit d0f5c2
        $numlines++;
Packit d0f5c2
        } else {
Packit d0f5c2
        $continuator = '';
Packit d0f5c2
        }
Packit d0f5c2
    }
Packit d0f5c2
    my $plib   = $self->{PERL_CORE} ? '"-I$(PERL_LIB)"' : '';
Packit d0f5c2
    $plib .= " -MCross=$::Cross::platform" if defined $::Cross::platform;
Packit d0f5c2
    my $ucopts = '-"Q" -"O"';
Packit d0f5c2
    $str .=  
Packit d0f5c2
        qq{\n\t\$(PERL) $plib $enc2xs $ucopts -o \$\@ -f $table.fnm\n\n};
Packit d0f5c2
    open (FILELIST, ">$table.fnm")
Packit d0f5c2
        || die "Could not open $table.fnm: $!";
Packit d0f5c2
    foreach my $file (@{$tables{$table}})
Packit d0f5c2
    {
Packit d0f5c2
        print FILELIST $self->catfile($dir,$file) . "\n";
Packit d0f5c2
    }
Packit d0f5c2
    close(FILELIST);
Packit d0f5c2
    }
Packit d0f5c2
    return $str;
Packit d0f5c2
}
Packit d0f5c2