enable Errno build on win32, add Errno-1.08 files to repository
Gurusamy Sarathy [Sun, 28 Jun 1998 15:28:29 +0000 (15:28 +0000)]
p4raw-id: //depot/perl@1222

MANIFEST
ext/Errno/ChangeLog [new file with mode: 0644]
ext/Errno/Errno_pm.PL [new file with mode: 0644]
ext/Errno/Makefile.PL [new file with mode: 0644]
t/lib/errno.t [new file with mode: 0755]
win32/Makefile
win32/config.bc
win32/config.gc
win32/config.vc
win32/makefile.mk

index 6f7f918..a97d60a 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -189,6 +189,7 @@ ext/DynaLoader/dl_next.xs   Next implementation
 ext/DynaLoader/dl_none.xs      Stub implementation
 ext/DynaLoader/dl_vms.xs       VMS implementation
 ext/DynaLoader/dlutils.c       Dynamic loader utilities for dl_*.xs files
+ext/Errno/ChangeLog            Errno perl module change log
 ext/Errno/Errno_pm.PL          Errno perl module create script
 ext/Errno/Makefile.PL          Errno extension makefile writer
 ext/Fcntl/Fcntl.pm             Fcntl extension Perl module
diff --git a/ext/Errno/ChangeLog b/ext/Errno/ChangeLog
new file mode 100644 (file)
index 0000000..a1d36e2
--- /dev/null
@@ -0,0 +1,34 @@
+Change 160 on 1998/06/27 by <gbarr@pobox.com> (Graham Barr)
+
+       - Added patch from Sarathy to support Win32
+       - Changed use of $Config{cpp} to $Config{cpprun} as suggested by
+         Tom Horsley
+
+Change 159 on 1998/06/27 by <gbarr@pobox.com> (Graham Barr)
+
+       - Changed to use cpp to locate required files
+       - Moved dummy Errno.pm file into d/
+       - Added support for VMS
+
+Change 158 on 1998/06/27 by <gbarr@pobox.com> (Graham Barr)
+
+       Rename errno.pl to Errno_pm.PL
+
+Change 146 on 1998/05/31 by <gbarr@pobox.com> (Graham Barr)
+
+       Added ChangeLog to MANIFEST
+
+Change 140 on 1998/05/23 by <gbarr@pobox.com> (Graham Barr)
+
+       Fix type in errno.pl
+
+Change 139 on 1998/05/23 by <gbarr@pobox.com> (Graham Barr)
+
+       Moved code to generate Errno.pm into errno.pl
+
+Change 136 on 1998/05/19 by <gbarr@pobox.com> (Graham Barr)
+
+       Changed to use cpp to locate constants
+       
+       Added t/errno.t
+
diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL
new file mode 100644 (file)
index 0000000..b669790
--- /dev/null
@@ -0,0 +1,268 @@
+#!perl
+use ExtUtils::MakeMaker;
+use Config;
+use strict;
+
+use vars qw($VERSION);
+
+$VERSION = "1.08";
+
+my %err = ();
+
+unlink "Errno.pm" if -f "Errno.pm";
+open OUT, ">Errno.pm" or die "Cannot open Errno.pm: $!";
+select OUT;
+my $file;
+foreach $file (get_files()) {
+    process_file($file);
+}
+write_errno_pm();
+unlink "errno.c" if -f "errno.c";
+
+sub process_file {
+    my($file) = @_;
+
+    return unless defined $file;
+
+    local *FH;
+    if (($^O eq 'VMS') && ($Config{vms_cc_type} ne 'gnuc')) {
+       unless(open(FH," LIBRARY/EXTRACT=ERRNO/OUTPUT=SYS\$OUTPUT $file |")) {
+            warn "Cannot open '$file'";
+            return;
+       }     
+    } else {
+       unless(open(FH,"< $file")) {
+            warn "Cannot open '$file'";
+            return;
+       }
+    }
+    while(<FH>) {
+       $err{$1} = 1
+           if /^#\s*define\s+(E\w+)\s+/;
+   }
+   close(FH);
+}
+
+sub get_files {
+    my %file = ();
+    # VMS keeps its include files in system libraries (well, except for Gcc)
+    if ($^O eq 'VMS') {
+       if ($Config{vms_cc_type} eq 'decc') {
+           $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1;
+       } elsif ($Config{vms_cc_type} eq 'vaxc') {
+           $file{'Sys$Library:vaxcdef.tlb'} = 1;
+       } elsif ($Config{vms_cc_type} eq 'gcc') {
+           $file{'gnu_cc_include:[000000]errno.h'} = 1;
+       }
+    } else {
+       open(CPPI,"> errno.c") or
+           die "Cannot open errno.c";
+
+       print CPPI "#include <errno.h>\n";
+
+       close(CPPI);
+
+       # invoke CPP and read the output
+
+       open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
+           die "Cannot exec $Config{cpprun}";
+
+       my $pat;
+       if ($^O eq 'MSWin32' and $Config{cc} =~ /^bcc/i) {
+           $pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/';
+       }
+       else {
+           $pat = '^#(?:line)?\s+\d+\s+"([^"]+)"';
+       }
+       while(<CPPO>) {
+           $file{$1} = 1 if /$pat/o;
+       }
+       close(CPPO);
+    }
+    return keys %file;
+}
+
+sub write_errno_pm {
+    my $err;
+
+    # create the CPP input
+
+    open(CPPI,"> errno.c") or
+       die "Cannot open errno.c";
+
+    print CPPI "#include <errno.h>\n";
+
+    foreach $err (keys %err) {
+       print CPPI '"',$err,'" [[',$err,']]',"\n";
+    }
+
+    close(CPPI);
+
+    # invoke CPP and read the output
+    if ($^O eq 'VMS') {
+       my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}";
+       $cpp =~ s/sys\$input//i;
+       open(CPPO,"$cpp  errno.c |") or
+          die "Cannot exec $Config{cppstdin}";
+    } else {
+       open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
+           die "Cannot exec $Config{cpprun}";
+    }
+
+    %err = ();
+
+    while(<CPPO>) {
+       my($name,$expr);
+       next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
+       next if $name eq $expr;
+       $err{$name} = eval $expr;
+    }
+    close(CPPO);
+
+    # Write Errno.pm
+
+    print <<"EDQ";
+#
+# This file is auto-generated. ***ANY*** changes here will be lost
+#
+
+package Errno;
+use vars qw(\@EXPORT_OK \%EXPORT_TAGS \@ISA \$VERSION \%errno \$AUTOLOAD);
+use Exporter ();
+use Config;
+use strict;
+
+\$Config{'myarchname'} eq "$Config{'myarchname'}" or
+       die "Errno architecture ($Config{'myarchname'}) does not match executable architecture (\$Config{'myarchname'})";
+
+\$VERSION = "$VERSION";
+\@ISA = qw(Exporter);
+
+EDQ
+   
+    my $len = 0;
+    my @err = sort { $err{$a} <=> $err{$b} } keys %err;
+    map { $len = length if length > $len } @err;
+
+    my $j = "\@EXPORT_OK = qw(" . join(" ",keys %err) . ");\n";
+    $j =~ s/(.{50,70})\s/$1\n\t/g;
+    print $j,"\n";
+
+print <<'ESQ';
+%EXPORT_TAGS = (
+    POSIX => [qw(
+ESQ
+
+    my $k = join(" ", grep { exists $err{$_} } 
+       qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
+       EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
+       ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
+       EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
+       EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
+       EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
+       ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
+       ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
+       ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
+       EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
+       ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
+       ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
+       EUSERS EWOULDBLOCK EXDEV));
+
+    $k =~ s/(.{50,70})\s/$1\n\t/g;
+    print "\t",$k,"\n    )]\n);\n\n";
+
+    foreach $err (@err) {
+       printf "sub %s () { %d }\n",,$err,$err{$err};
+    }
+
+    print <<'ESQ';
+
+sub TIEHASH { bless [] }
+
+sub FETCH {
+    my ($self, $errname) = @_;
+    my $proto = prototype("Errno::$errname");
+    if (defined($proto) && $proto eq "") {
+       no strict 'refs';
+        return $! == &$errname;
+    }
+    require Carp;
+    Carp::confess("No errno $errname");
+} 
+
+sub STORE {
+    require Carp;
+    Carp::confess("ERRNO hash is read only!");
+}
+
+*CLEAR = \&STORE;
+*DELETE = \&STORE;
+
+sub NEXTKEY {
+    my($k,$v);
+    while(($k,$v) = each %Errno::) {
+       my $proto = prototype("Errno::$k");
+       last if (defined($proto) && $proto eq "");
+       
+    }
+    $k
+}
+
+sub FIRSTKEY {
+    my $s = scalar keys %Errno::;
+    goto &NEXTKEY;
+}
+
+sub EXISTS {
+    my ($self, $errname) = @_;
+    my $proto = prototype($errname);
+    defined($proto) && $proto eq "";
+}
+
+tie %!, __PACKAGE__;
+
+1;
+__END__
+
+=head1 NAME
+
+Errno - System errno constants
+
+=head1 SYNOPSIS
+
+    use Errno qw(EINTR EIO :POSIX);
+
+=head1 DESCRIPTION
+
+C<Errno> defines and conditionally exports all the error constants
+defined in your system C<errno.h> include file. It has a single export
+tag, C<:POSIX>, which will export all POSIX defined error numbers.
+
+C<Errno> also makes C<%!> magic such that each element of C<%!> has a non-zero
+value only if C<$!> is set to that value, eg
+
+    use Errno;
+    
+    unless (open(FH, "/fangorn/spouse")) {
+        if ($!{ENOENT}) {
+            warn "Get a wife!\n";
+        } else {
+            warn "This path is barred: $!";
+        } 
+    } 
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1997-8 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+ESQ
+
+}
diff --git a/ext/Errno/Makefile.PL b/ext/Errno/Makefile.PL
new file mode 100644 (file)
index 0000000..ffc8c4b
--- /dev/null
@@ -0,0 +1,29 @@
+use ExtUtils::MakeMaker;
+
+@VMS = ($^O eq 'VMS') ? (MAN3PODS => ' ') : ();
+
+WriteMakefile(
+    NAME        => 'Errno',
+    VERSION_FROM => 'Errno_pm.PL',
+    PL_FILES    => {'Errno_pm.PL'=>'Errno.pm'},
+    PM          => {'Errno.pm' => '$(INST_LIBDIR)/Errno.pm'},
+    'clean'     => {FILES => 'Errno.pm'},
+    'dist'      => {
+       COMPRESS => 'gzip -9f',
+       SUFFIX   => '.gz', 
+       DIST_DEFAULT => 'd/Errno.pm tardist',
+    },
+    @VMS,
+);
+
+sub MY::postamble {
+    my $TARG = MM->catfile('d','Errno.pm');
+qq!$TARG : Makefile
+       echo '#This is a dummy file so CPAN will find a VERSION' > $TARG
+       echo 'package Errno;' >> $TARG
+       echo '\$\$VERSION = "\$(VERSION)";' >>$TARG
+       echo '#This is to make sure require will return an error' >>$TARG
+       echo '0;' >>$TARG
+
+!
+}
diff --git a/t/lib/errno.t b/t/lib/errno.t
new file mode 100755 (executable)
index 0000000..0e0462b
--- /dev/null
@@ -0,0 +1,36 @@
+#!./perl
+
+BEGIN {
+    unless(grep /blib/, @INC) {
+       chdir 't' if -d 't';
+       @INC = '../lib' if -d '../lib';
+    }
+}
+
+use Errno;
+
+print "1..5\n";
+
+print "not " unless @Errno::EXPORT_OK;
+print "ok 1\n";
+die unless @Errno::EXPORT_OK;
+
+$err = $Errno::EXPORT_OK[0];
+$num = &{"Errno::$err"};
+
+print "not " unless &{"Errno::$err"} == $num;
+print "ok 2\n";
+
+$! = $num;
+print "not " unless $!{$err};
+print "ok 3\n";
+
+$! = 0;
+print "not " if $!{$err};
+print "ok 4\n";
+
+$s1 = join(",",sort keys(%!));
+$s2 = join(",",sort @Errno::EXPORT_OK);
+
+print "not " unless $s1 eq $s2;
+print "ok 5\n";
index 045834d..fce1ed0 100644 (file)
@@ -450,6 +450,7 @@ PERL95_OBJ  = $(PERL95_OBJ) DynaLoadmt$(o)
 
 DYNAMIC_EXT    = Socket IO Fcntl Opcode SDBM_File POSIX attrs Thread B
 STATIC_EXT     = DynaLoader
+NONXS_EXT      = Errno
 
 DYNALOADER     = $(EXTDIR)\DynaLoader\DynaLoader
 SOCKET         = $(EXTDIR)\Socket\Socket
@@ -461,6 +462,7 @@ POSIX               = $(EXTDIR)\POSIX\POSIX
 ATTRS          = $(EXTDIR)\attrs\attrs
 THREAD         = $(EXTDIR)\Thread\Thread
 B              = $(EXTDIR)\B\B
+ERRNO          = $(EXTDIR)\Errno\Errno
 
 SOCKET_DLL     = $(AUTODIR)\Socket\Socket.dll
 FCNTL_DLL      = $(AUTODIR)\Fcntl\Fcntl.dll
@@ -472,6 +474,8 @@ ATTRS_DLL   = $(AUTODIR)\attrs\attrs.dll
 THREAD_DLL     = $(AUTODIR)\Thread\Thread.dll
 B_DLL          = $(AUTODIR)\B\B.dll
 
+ERRNO_PM       = $(LIBDIR)\Errno.pm
+
 EXTENSION_C    =               \
                $(SOCKET).c     \
                $(FCNTL).c      \
@@ -493,6 +497,9 @@ EXTENSION_DLL       =               \
                $(ATTRS_DLL)    \
                $(B_DLL)
 
+EXTENSION_PM   =               \
+               $(ERRNO_PM)
+
 !IF "$(OBJECT)" == ""
 EXTENSION_DLL  =               \
                $(EXTENSION_DLL)\
@@ -522,6 +529,7 @@ CFG_VARS    =                                       \
                "make=nmake"                            \
                "static_ext=$(STATIC_EXT)"              \
                "dynamic_ext=$(DYNAMIC_EXT)"            \
+               "nonxs_ext=$(NONXS_EXT)"                \
                "usethreads=$(USE_THREADS)"             \
                "LINK_FLAGS=$(LINK_FLAGS)"              \
                "optimize=$(OPTIMIZE)"
@@ -531,7 +539,7 @@ CFG_VARS    =                                       \
 #
 
 all : .\config.h $(GLOBEXE) $(MINIMOD) $(CONFIGPM) $(PERLEXE) $(PERL95EXE) \
-       $(CAPILIB) $(X2P) $(EXTENSION_DLL)
+       $(CAPILIB) $(X2P) $(EXTENSION_DLL) $(EXTENSION_PM)
 
 $(DYNALOADER)$(o) : $(DYNALOADER).c $(CORE_H) $(EXTDIR)\DynaLoader\dlutils.c
 
@@ -755,6 +763,12 @@ $(SOCKET_DLL): $(PERLEXE) $(SOCKET).xs
        $(MAKE)
        cd ..\..\win32
 
+$(ERRNO_PM): $(PERLEXE) $(ERRNO)_pm.PL
+       cd $(EXTDIR)\$(*B)
+       ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
+       $(MAKE)
+       cd ..\..\win32
+
 doc: $(PERLEXE)
        copy ..\README.win32 ..\pod\perlwin32.pod
        $(PERLEXE) -I..\lib ..\installhtml --podroot=.. --htmldir=./html \
@@ -773,8 +787,8 @@ distclean: clean
        -del /f $(MINIPERL) $(PERLEXE) $(PERL95EXE) $(PERLDLL) $(GLOBEXE) \
                $(PERLIMPLIB) ..\miniperl.lib $(MINIMOD)
        -del /f *.def *.map
-       -del /f $(EXTENSION_DLL)
-       -del /f $(EXTENSION_C) $(DYNALOADER).c
+       -del /f $(EXTENSION_DLL) $(EXTENSION_PM)
+       -del /f $(EXTENSION_C) $(DYNALOADER).c $(ERRNO).pm
        -del /f $(EXTDIR)\DynaLoader\dl_win32.xs
        -del /f $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\DynaLoader.pm
        -del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm
index 78b6f19..5ee5af6 100644 (file)
@@ -437,6 +437,7 @@ netdb_net_type='long'
 nm=''
 nm_opt=''
 nm_so_opt=''
+nonxs_ext='Errno'
 nroff=''
 o_nonblock='O_NONBLOCK'
 obj_ext='.obj'
index 720b511..73f8219 100644 (file)
@@ -437,6 +437,7 @@ netdb_net_type='long'
 nm='nm'
 nm_opt=''
 nm_so_opt=''
+nonxs_ext='Errno'
 nroff=''
 o_nonblock='O_NONBLOCK'
 obj_ext='.o'
index b515fd7..aefd034 100644 (file)
@@ -437,6 +437,7 @@ netdb_net_type='long'
 nm=''
 nm_opt=''
 nm_so_opt=''
+nonxs_ext='Errno'
 nroff=''
 o_nonblock='O_NONBLOCK'
 obj_ext='.obj'
index e99e80e..3de2c57 100644 (file)
@@ -562,6 +562,7 @@ PERL95_OBJ  += DynaLoadmt$(o)
 
 DYNAMIC_EXT    = Socket IO Fcntl Opcode SDBM_File POSIX attrs Thread B
 STATIC_EXT     = DynaLoader
+NONXS_EXT      = Errno
 
 DYNALOADER     = $(EXTDIR)\DynaLoader\DynaLoader
 SOCKET         = $(EXTDIR)\Socket\Socket
@@ -573,6 +574,7 @@ POSIX               = $(EXTDIR)\POSIX\POSIX
 ATTRS          = $(EXTDIR)\attrs\attrs
 THREAD         = $(EXTDIR)\Thread\Thread
 B              = $(EXTDIR)\B\B
+ERRNO          = $(EXTDIR)\Errno\Errno
 
 SOCKET_DLL     = $(AUTODIR)\Socket\Socket.dll
 FCNTL_DLL      = $(AUTODIR)\Fcntl\Fcntl.dll
@@ -584,6 +586,8 @@ ATTRS_DLL   = $(AUTODIR)\attrs\attrs.dll
 THREAD_DLL     = $(AUTODIR)\Thread\Thread.dll
 B_DLL          = $(AUTODIR)\B\B.dll
 
+ERRNO_PM       = $(LIBDIR)\Errno.pm
+
 EXTENSION_C    =               \
                $(SOCKET).c     \
                $(FCNTL).c      \
@@ -605,6 +609,9 @@ EXTENSION_DLL       =               \
                $(ATTRS_DLL)    \
                $(B_DLL)
 
+EXTENSION_PM   =               \
+               $(ERRNO_PM)
+
 .IF "$(OBJECT)" == ""
 EXTENSION_DLL  +=              \
                $(THREAD_DLL)
@@ -635,6 +642,7 @@ CFG_VARS    =                                       \
                "_a=$(a)" "lib_ext=$(a)"                \
                "static_ext=$(STATIC_EXT)"              \
                "dynamic_ext=$(DYNAMIC_EXT)"            \
+               "nonxs_ext=$(NONXS_EXT)"                \
                "usethreads=$(USE_THREADS)"             \
                "LINK_FLAGS=$(LINK_FLAGS)"              \
                "optimize=$(OPTIMIZE)"
@@ -644,7 +652,7 @@ CFG_VARS    =                                       \
 #
 
 all : .\config.h $(GLOBEXE) $(MINIMOD) $(CONFIGPM) $(PERLEXE) $(PERL95EXE) \
-       $(CAPILIB) $(X2P) $(EXTENSION_DLL)
+       $(CAPILIB) $(X2P) $(EXTENSION_DLL) $(EXTENSION_PM)
 
 $(DYNALOADER)$(o) : $(DYNALOADER).c $(CORE_H) $(EXTDIR)\DynaLoader\dlutils.c
 
@@ -921,6 +929,11 @@ $(SOCKET_DLL): $(PERLEXE) $(SOCKET).xs
        ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
        cd $(EXTDIR)\$(*B) && $(MAKE)
 
+$(ERRNO_PM): $(PERLEXE) $(ERRNO)_pm.PL
+       cd $(EXTDIR)\$(*B) && \
+       ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl
+       cd $(EXTDIR)\$(*B) && $(MAKE)
+
 doc: $(PERLEXE)
        copy ..\README.win32 ..\pod\perlwin32.pod
        $(PERLEXE) -I..\lib ..\installhtml --podroot=.. --htmldir=./html \
@@ -936,8 +949,8 @@ distclean: clean
        -del /f $(MINIPERL) $(PERLEXE) $(PERL95EXE) $(PERLDLL) $(GLOBEXE) \
                $(PERLIMPLIB) ..\miniperl$(a) $(MINIMOD)
        -del /f *.def *.map
-       -del /f $(EXTENSION_DLL)
-       -del /f $(EXTENSION_C) $(DYNALOADER).c
+       -del /f $(EXTENSION_DLL) $(EXTENSION_PM)
+       -del /f $(EXTENSION_C) $(DYNALOADER).c $(ERRNO).pm
        -del /f $(EXTDIR)\DynaLoader\dl_win32.xs
        -del /f $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\DynaLoader.pm
        -del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm