The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use ExtUtils::MakeMaker;

use Config qw(%Config &config_sh);
use IO::File;

#
# Grab things that perl's Configure has already discovered
#
#AutoConf::Define(sigret_t => $Config{'signal_t'});
#AutoConf::Define(SIGPROTOARG => '()');
#
# Now some poking around in /dev to see what we can find
#

my @define;

if (-c '/dev/ptmx' && -d '/dev/pts')
{
    push(@define, '-DHAVE_DEV_PTMX');
}
else
{
    push(@define, '-DHAVE_DEV_PTC')
	     if (-e "/dev/ptc");

    $pdir = (-d "/dev/ptym") ? "/dev/ptym" : "/dev";
    @ptys = <$pdir/pty??>;
    if (@ptys)
     {
      my %p0 = ();
      my %p1 = ();
      foreach (@ptys)
       {
	my ($x,$y) = /(.)(.)$/;
	$p0{$x}++;
	$p1{$y}++;
       }
      push(@define, '-DPTYRANGE0=\\"' . join('',sort(keys %p0)) . '\\"');
      push(@define, '-DPTYRANGE1=\\"' . join('',sort(keys %p1)) . '\\"');

      push(@define, '-DPTYTEMPLATE=\\"' . "$pdir/ptyXY" . '\\"');
     }
}


unless( mkdir 'conf', 0777 ) {
  my $e = $!;
  die "mkdir: $e" unless -d 'conf';
}

use Cwd qw(getcwd);
my $dir = getcwd;
chdir('conf') or die "chdir: $!";
open(TST,">tst.c") or die "open: $!";
print TST <<'ESQ';
extern char *ttyname(int);
int main () { (void)ttyname(0); return 0; }
ESQ
close(TST);
$|=1;
print "Looking for ttyname()....";
if( system(split(/\s+/, $Config{'cc'}), split(' ',$Config{'cppflags'}),'tst.c')) {
  print <<EDQ;

I cannot seem to find ttyname() on your system

EDQ
}
else {
 push(@define, '-DHAS_TTYNAME');
 print "Found\n";
}

chdir($dir) or die "chdir: $!";

open(SUB,">xssubs.c") or die "open: $!";
foreach (qw(B0 B110 B115200 B1200 B134 B150 B153600 B1800 B19200 B200 B230400
	    B2400 B300 B307200 B38400 B460800 B4800 B50 B57600 B600 B75 B76800
	    B9600 BRKINT BS0 BS1 BSDLY CBAUD CBAUDEXT CBRK CCTS_OFLOW CDEL
	    CDSUSP CEOF CEOL CEOL2 CEOT CERASE CESC CFLUSH CIBAUD CIBAUDEXT
	    CINTR CKILL CLNEXT CLOCAL CNSWTCH CNUL CQUIT CR0 CR1 CR2 CR3 CRDLY
	    CREAD CRPRNT CRTSCTS CRTSXOFF CRTS_IFLOW CS5 CS6 CS7 CS8 CSIZE
	    CSTART CSTOP CSTOPB CSUSP CSWTCH CWERASE DEFECHO DIOC DIOCGETP
	    DIOCSETP DOSMODE ECHO ECHOCTL ECHOE ECHOK ECHOKE ECHONL ECHOPRT
	    EXTA EXTB FF0 FF1 FFDLY FIORDCHK FLUSHO HUPCL ICANON ICRNL IEXTEN
	    IGNBRK IGNCR IGNPAR IMAXBEL INLCR INPCK ISIG ISTRIP IUCLC IXANY
	    IXOFF IXON KBENABLED LDCHG LDCLOSE LDDMAP LDEMAP LDGETT LDGMAP
	    LDIOC LDNMAP LDOPEN LDSETT LDSMAP LOBLK NCCS NL0 NL1 NLDLY NOFLSH
	    OCRNL OFDEL OFILL OLCUC ONLCR ONLRET ONOCR OPOST PAGEOUT PARENB
	    PAREXT PARMRK PARODD PENDIN RCV1EN RTS_TOG TAB0 TAB1 TAB2 TAB3
	    TABDLY TCDSET TCFLSH TCGETA TCGETS TCIFLUSH TCIOFF TCIOFLUSH TCION
	    TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW TCSBRK TCSETA
	    TCSETAF TCSETAW TCSETS TCSETSF TCSETSW TCXONC TERM_D40 TERM_D42
	    TERM_H45 TERM_NONE TERM_TEC TERM_TEX TERM_V10 TERM_V61 TIOCCBRK
	    TIOCCDTR TIOCEXCL TIOCFLUSH TIOCGETC TIOCGETD TIOCGETP TIOCGLTC
	    TIOCGPGRP TIOCGSID TIOCGSOFTCAR TIOCGWINSZ TIOCHPCL TIOCKBOF
	    TIOCKBON TIOCLBIC TIOCLBIS TIOCLGET TIOCLSET TIOCMBIC TIOCMBIS
	    TIOCMGET TIOCMSET TIOCM_CAR TIOCM_CD TIOCM_CTS TIOCM_DSR TIOCM_DTR
	    TIOCM_LE TIOCM_RI TIOCM_RNG TIOCM_RTS TIOCM_SR TIOCM_ST TIOCNOTTY
	    TIOCNXCL TIOCOUTQ TIOCREMOTE TIOCSBRK TIOCSDTR TIOCSETC TIOCSETD
	    TIOCSETN TIOCSETP TIOCSIGNAL TIOCSLTC TIOCSPGRP TIOCSSID
	    TIOCSSOFTCAR TIOCSTART TIOCSTI TIOCSTOP TIOCSWINSZ TM_ANL TM_CECHO
	    TM_CINVIS TM_LCF TM_NONE TM_SET TM_SNL TOSTOP VCEOF VCEOL VDISCARD
	    VDSUSP VEOF VEOL VEOL2 VERASE VINTR VKILL VLNEXT VMIN VQUIT
	    VREPRINT VSTART VSTOP VSUSP VSWTCH VT0 VT1 VTDLY VTIME VWERASE WRAP
	    XCASE XCLUDE XMT1EN XTABS))
{
  print SUB <<"EDQ";
#ifdef $_
        newCONSTSUB(stash,"$_", newSViv($_));
#else
        av_push(export_fail, newSVpv("$_",${\(length)}));
#endif
EDQ
}
close(SUB);

my @ppd;

if ($] >= 5.00503) {
  @ppd = (
    AUTHOR    => 'Graham Barr <gbarr@pobox.com>',
    ABSTRACT  => 'Pseudo tty\'s and constants'
  );
}

WriteMakefile(
    'NAME'	    => 'IO::Tty',
    'VERSION_FROM'  => "Tty.pm",
    'DEFINE'	    => join(" ", @define), 
    'clean'	    => {'FILES' => 'xssubs.c conf'},
    'MAP_TARGET'    => 'perltty',
    @ppd,
);

sub MY::postamble {

  return '' unless $] >= 5.00503;

<<'ESQ';

dist : ppd

ESQ
}