OS/400 PASE port
Jarkko Hietaniemi [Thu, 29 Aug 2002 22:22:51 +0000 (01:22 +0300)]
Message-ID: <20020829192251.GA27102@lyta.hut.fi>

p4raw-id: //depot/perl@17827

Configure
MANIFEST
README.os400 [new file with mode: 0644]
hints/aix.sh
hints/os400.sh [new file with mode: 0644]
lib/Cwd.pm
pod/buildtoc.PL
pod/perl.pod
pod/perlebcdic.pod
pod/perlport.pod

index e65ab41..d57d749 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -5418,7 +5418,7 @@ case "$usenm" in
        esac
        case "$dflt" in
        '') 
-               if $test "$osname" = aix -a ! -f /lib/syscalls.exp; then
+               if $test "$osname" = aix -a "X$PASE" != "$Xdefine" -a ! -f /lib/syscalls.exp; then
                        echo " "
                        echo "Whoops!  This is an AIX system without /lib/syscalls.exp!" >&4
                        echo "'nm' won't be sufficient on this sytem." >&4
@@ -5765,11 +5765,19 @@ else
        fi
 fi
 nm_extract="$com"
-if $test -f /lib/syscalls.exp; then
+case "$PASE" in
+define)
+    echo " "
+    echo "Since you are compiling for PASE, extracting more symbols from libc.a...">&4
+    nm -Tv /lib/libc.a | grep '^\.[a-z]' | awk '$2 == "T" {print $1}' | sed 's/^.//' >> libc.list
+    ;;
+*)  if $test -f /lib/syscalls.exp; then
        echo " "
        echo "Also extracting names from /lib/syscalls.exp for good ole AIX..." >&4
        $sed -n 's/^\([^        ]*\)[   ]*syscall[0-9]*[        ]*$/\1/p' /lib/syscalls.exp >>libc.list
-fi
+    fi
+    ;;
+esac
 ;;
 esac
 $rm -f libnames libpath
index f0341a3..f8ab653 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -809,6 +809,7 @@ hints/openbsd.sh            Hints for named architecture
 hints/opus.sh                  Hints for named architecture
 hints/os2.sh                   Hints for named architecture
 hints/os390.sh                 Hints for named architecture
+hints/os400.sh                 Hints for named architecture
 hints/posix-bc.sh              Hints for named architecture
 hints/powerux.sh               Hints for named architecture
 hints/qnx.sh                   Hints for named architecture
@@ -2296,6 +2297,7 @@ README.mpeix              Notes about MPE/iX port
 README.netware         Notes about NetWare port
 README.os2             Notes about OS/2 port
 README.os390           Notes about OS/390 (nee MVS) port
+README.os400           Notes about OS/400 port
 README.plan9           Notes about Plan9 port
 README.qnx             Notes about QNX port
 README.solaris         Notes about Solaris port
diff --git a/README.os400 b/README.os400
new file mode 100644 (file)
index 0000000..572149b
--- /dev/null
@@ -0,0 +1,90 @@
+If you read this file _as_is_, just ignore the funny characters you see.
+It is written in the POD format (see pod/perlpod.pod) which is specially
+designed to be readable as is.
+
+=head1 NAME
+
+README.os400 - Perl version 5 on OS/400
+
+=head1 DESCRIPTION
+
+This document describes various features of IBM's OS/400 operating
+system that will affect how Perl version 5 (hereafter just Perl) is
+compiled and/or runs.
+
+By far the easiest way to build Perl for OS/400 is to use the PASE
+(Portable Application Solutions Environment), for more information see
+http://www.iseries.ibm.com/developer/factory/pase/index.html
+This environment allows one to use AIX APIs while programming, and it
+provides a runtime that allows AIX binaries to execute directly on the
+PowerPC iSeries.
+
+=head2 Compiling Perl for OS/400 PASE
+
+The recommended way to build Perl for the OS/400 PASE is to build the
+Perl 5 source code (release 5.8.1 or later) under AIX.
+
+The trick is to give a special parameter to the Configure shell script
+when running it on AIX:
+
+  sh Configure -DPASE ...
+
+The default installation directory of Perl under PASE is /QOpenSys/perl.
+This can be modified if needed with Configure parameter -Dprefix=/some/dir.
+
+Starting from OS/400 V5R2 the IBM Visual Age compiler is supported
+on OS/400 PASE, so it is possible to build Perl natively on OS/400.  
+The easier way, however, is to compile in AIX, as just described.
+
+If building natively on PASE, please do the build under the /QOpenSys
+directory, since Perl is happier when built on a case sensitive filesystem.
+
+=head2 Installing Perl in OS/400 PASE
+
+If you are compiling on AIX, simply do a "make install" on the AIX box.
+Once the install finishes, tar up the /QOpenSys/perl directory.  Transfer
+the tarball to the OS/400 using FTP with the following commands:
+
+  > binary
+  > site namefmt 1
+  > put perl.tar /QOpenSys
+
+Once you have it on, simply bring up a PASE shell and extract the tarball.
+
+If you are compiling in PASE, then "make install" is the only thing you
+will need to do.
+
+The default path for perl binary is /QOpenSys/perl/bin/perl.  You'll
+want to symlink /QOpenSys/usr/bin/perl to this file so you don't have
+to modify your path.
+
+=head2 Using Perl in OS/400 PASE
+
+Perl in PASE may be used in the same manner as you would use Perl on AIX.
+
+Scripts starting with #!/usr/bin/perl should work if you have
+/QOpenSys/usr/bin/perl symlinked to your perl binary.  This will not
+work if you've done a setuid/setgid or have environment variable
+PASE_EXEC_QOPENSYS="N".  If you have V5R1, you'll need to get the
+latest PTFs to have this feature.  Scripts starting with
+#!/QOpenSys/perl/bin/perl should always work.
+
+=head2 Perl on ILE
+
+There exists a port of Perl to the ILE environment.  This port, however,
+is based quite an old release of Perl, Perl 5.00502 (August 1998).
+(As of July 2002 the latest release of Perl is 5.8.0, and even 5.6.1
+has been out since April 2001.)  If you need to run Perl on ILE, though,
+you may need this older port: http://www.cpan.org/ports/#os400
+Note that any Perl release later than 5.00502 has not been ported to ILE.
+
+If you need to use Perl in the ILE environment, you may want to consider
+using Qp2RunPase() to call the PASE version of Perl.
+
+=head1 AUTHORS
+
+Jarkko Hietaniemi <jhi@iki.fi>
+Bryan Logan <bryanlog@us.ibm.com>
+David Larson <larson1@us.ibm.com>
+
+=cut
index 231d348..bee1479 100644 (file)
@@ -535,4 +535,28 @@ else
        esac
 fi
 
+case "$PASE" in
+define)
+       case "$prefix" in
+       '') prefix=/QOpenSys/perl ;;
+       esac
+       cat >&4 <<EOF
+
+***
+*** You seem to be compiling in AIX for the OS/400 PASE environment.
+*** I'm not going to use the AIX bind, nsl, and possible util libraries, then.
+*** I'm also not going to install perl as /usr/bin/perl.
+*** Perl will be installed under $prefix.
+*** For instructions how to install this build from AIX to PASE,
+*** see the file README.os400.  Accept the "aix" for the question
+*** about "Operating system name".
+***
+EOF
+       set `echo " $libswanted " | sed -e 's@ bind @ @' -e 's@ nsl @ @' -e 's@ util @ @'`
+       shift
+       libswanted="$*"
+       installusrbinperl="$undef"
+       ;;
+esac
+
 # EOF
diff --git a/hints/os400.sh b/hints/os400.sh
new file mode 100644 (file)
index 0000000..16eec2f
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# We will just reuse the AIX hints since we support only building
+# for the PASE and the PASE hints are merged with the AIX hints.
+#
+
+case "$PASE" in
+'') cat >&4 <<EOF
+***
+*** This build process only works with the PASE environment (not ILE).
+*** You must supply the -DPASE parameter to the Configure script,
+*** please read the file README.os400.  Exiting now.
+***
+EOF
+    exit 1
+    ;;
+*)  cat >&4 <<EOF
+***
+*** Using the AIX hints file, $src/hints/aix.sh.
+***
+EOF
+    osname=aix
+    . $src/hints/aix.sh
+    ;;
+esac
index 8b00543..7f8ef65 100644 (file)
@@ -192,7 +192,16 @@ foreach my $try (qw(/bin/pwd /usr/bin/pwd)) {
         last;
     }
 }
-$pwd_cmd ||= 'pwd';
+unless ($pwd_cmd) {
+    if (-x '/QOpenSys/bin/pwd') { # OS/400 PASE.
+        $pwd_cmd = '/QOpenSys/bin/pwd' ;
+    } else {
+        # Isn't this wrong?  _backtick_pwd() will fail if somenone has
+        # pwd in their path but it is not /bin/pwd or /usr/bin/pwd?
+        # See [perl #16774]. --jhi
+        $pwd_cmd = 'pwd';
+    }
+}
 
 # The 'natural and safe form' for UNIX (pwd may be setuid root)
 sub _backtick_pwd {
index acb45d6..be9c004 100644 (file)
@@ -81,6 +81,7 @@ if (-d "pod") {
     perlnetware             
     perlos2             
     perlos390           
+    perlos400           
     perlqnx
     perlplan9
     perlsolaris
index 5aee015..75331e1 100644 (file)
@@ -166,6 +166,7 @@ For ease of access, the Perl manual has been split up into several sections.
     perlnetware                Perl notes for NetWare
     perlos2            Perl notes for OS/2
     perlos390          Perl notes for OS/390
+    perlos400          Perl notes for OS/400
     perlplan9          Perl notes for Plan 9
     perlqnx            Perl notes for QNX
     perlsolaris        Perl notes for Solaris
index 44ad6b9..1e96fdb 100644 (file)
@@ -1248,12 +1248,16 @@ Legacy multi byte EBCDIC code pages XXX.
 There may be a few system dependent issues 
 of concern to EBCDIC Perl programmers.
 
-=head2 OS/400 
-
-The PASE environment.
+=head2 OS/400
 
 =over 8
 
+=item PASE
+
+The PASE environment is runtime environment for OS/400 that can run
+executables built for PowerPC AIX in OS/400, see L<perlos400>.  PASE
+is ASCII-based, not EBCDIC-based as the ILE.
+
 =item IFS access
 
 XXX.
index 9a76d24..65ca9d8 100644 (file)
@@ -188,9 +188,9 @@ The Unix column assumes that you are not accessing a serial line
 "\n", and "\n" on output becomes CRLF.
 
 These are just the most common definitions of C<\n> and C<\r> in Perl.
-There may well be others.  For example, on an EBCDIC implementation such
-as z/OS or OS/400 the above material is similar to "Unix" but the code
-numbers change:
+There may well be others.  For example, on an EBCDIC implementation
+such as z/OS (OS/390) or OS/400 (using the ILE, the PASE is ASCII-based)
+the above material is similar to "Unix" but the code numbers change:
 
     LF  eq  \025  eq  \x15  eq           chr(21)  eq  CP-1047 21
     LF  eq  \045  eq  \x25  eq  \cU  eq  chr(37)  eq  CP-0037 37
@@ -1136,7 +1136,9 @@ Character Code Set ID 0037 for OS/400 and either 1047 or POSIX-BC for S/390
 systems).  On the mainframe perl currently works under the "Unix system
 services for OS/390" (formerly known as OpenEdition), VM/ESA OpenEdition, or
 the BS200 POSIX-BC system (BS2000 is supported in perl 5.6 and greater).
-See L<perlos390> for details.  
+See L<perlos390> for details.  Note that for OS/400 there is also a port of
+Perl 5.8.1/5.9.0 or later to the PASE which is ASCII-based (as opposed to
+ILE which is EBCDIC-based), see L<perlos400>. 
 
 As of R2.5 of USS for OS/390 and Version 2.3 of VM/ESA these Unix
 sub-systems do not support the C<#!> shebang trick for script invocation.
@@ -2053,7 +2055,7 @@ First public release with perl5.005.
 
 =head1 Supported Platforms
 
-As of June 2002 (the Perl release 5.8.0), the following platforms are
+As of July 2002 (the Perl release 5.8.0), the following platforms are
 able to build Perl from the standard source code distribution
 available at http://www.cpan.org/src/index.html
 
@@ -2078,6 +2080,7 @@ available at http://www.cpan.org/src/index.html
         OpenBSD
         OpenVMS         (VMS)
         OS/2
+        OS/400          (using the PASE) (since Perl 5.8.1/5.9.0)
         PowerUX
         POSIX-BC        (BS2000)
         QNX
@@ -2161,7 +2164,7 @@ binaries available via http://www.cpan.org/ports/
 
                                 Perl release
 
-        OS/400                  5.005_02
+        OS/400 (ILE)            5.005_02
         Tandem Guardian         5.004
 
 The following platforms have only binaries available via
@@ -2184,9 +2187,10 @@ L<perlaix>, L<perlamiga>, L<perlapollo>, L<perlbeos>, L<perlbs2000>,
 L<perlce>, L<perlcygwin>, L<perldgux>, L<perldos>, L<perlepoc>,
 L<perlebcdic>, L<perlfreebsd>, L<perlhurd>, L<perlhpux>, L<perlirix>,
 L<perlmachten>, L<perlmacos>, L<perlmint>, L<perlmpeix>,
-L<perlnetware>, L<perlos2>, L<perlos390>, L<perlplan9>, L<perlqnx>,
-L<perlsolaris>, L<perltru64>, L<perlunicode>, L<perlvmesa>,
-L<perlvms>, L<perlvos>, L<perlwin32>, and L<Win32>.
+L<perlnetware>, L<perlos2>, L<perlos390>, L<perlos400>,
+L<perlplan9>, L<perlqnx>, L<perlsolaris>, L<perltru64>,
+L<perlunicode>, L<perlvmesa>, L<perlvms>, L<perlvos>,
+L<perlwin32>, and L<Win32>.
 
 =head1 AUTHORS / CONTRIBUTORS