| 1 | This document is written in pod format hence there are punctuation |
| 2 | characters in odd places. Do not worry, you've apparently got the |
| 3 | ASCII->EBCDIC translation worked out correctly. You can read more |
| 4 | about pod in pod/perlpod.pod or the short summary in the INSTALL file. |
| 5 | |
| 6 | =head1 NAME |
| 7 | |
| 8 | perlbs2000 - building and installing Perl for BS2000. |
| 9 | |
| 10 | B<This document needs to be updated, but we don't know what it should say. |
| 11 | Please email comments to L<perlbug@perl.org|mailto:perlbug@perl.org>.> |
| 12 | |
| 13 | =head1 SYNOPSIS |
| 14 | |
| 15 | This document will help you Configure, build, test and install Perl |
| 16 | on BS2000 in the POSIX subsystem. |
| 17 | |
| 18 | =head1 DESCRIPTION |
| 19 | |
| 20 | This is a ported perl for the POSIX subsystem in BS2000 VERSION OSD |
| 21 | V3.1A or later. It may work on other versions, but we started porting |
| 22 | and testing it with 3.1A and are currently using Version V4.0A. |
| 23 | |
| 24 | You may need the following GNU programs in order to install perl: |
| 25 | |
| 26 | =head2 gzip on BS2000 |
| 27 | |
| 28 | We used version 1.2.4, which could be installed out of the box with |
| 29 | one failure during 'make check'. |
| 30 | |
| 31 | =head2 bison on BS2000 |
| 32 | |
| 33 | The yacc coming with BS2000 POSIX didn't work for us. So we had to |
| 34 | use bison. We had to make a few changes to perl in order to use the |
| 35 | pure (reentrant) parser of bison. We used version 1.25, but we had to |
| 36 | add a few changes due to EBCDIC. See below for more details |
| 37 | concerning yacc. |
| 38 | |
| 39 | =head2 Unpacking Perl Distribution on BS2000 |
| 40 | |
| 41 | To extract an ASCII tar archive on BS2000 POSIX you need an ASCII |
| 42 | filesystem (we used the mountpoint /usr/local/ascii for this). Now |
| 43 | you extract the archive in the ASCII filesystem without |
| 44 | I/O-conversion: |
| 45 | |
| 46 | cd /usr/local/ascii |
| 47 | export IO_CONVERSION=NO |
| 48 | gunzip < /usr/local/src/perl.tar.gz | pax -r |
| 49 | |
| 50 | You may ignore the error message for the first element of the archive |
| 51 | (this doesn't look like a tar archive / skipping to next file...), |
| 52 | it's only the directory which will be created automatically anyway. |
| 53 | |
| 54 | After extracting the archive you copy the whole directory tree to your |
| 55 | EBCDIC filesystem. B<This time you use I/O-conversion>: |
| 56 | |
| 57 | cd /usr/local/src |
| 58 | IO_CONVERSION=YES |
| 59 | cp -r /usr/local/ascii/perl5.005_02 ./ |
| 60 | |
| 61 | =head2 Compiling Perl on BS2000 |
| 62 | |
| 63 | There is a "hints" file for BS2000 called hints.posix-bc (because |
| 64 | posix-bc is the OS name given by `uname`) that specifies the correct |
| 65 | values for most things. The major problem is (of course) the EBCDIC |
| 66 | character set. We have german EBCDIC version. |
| 67 | |
| 68 | Because of our problems with the native yacc we used GNU bison to |
| 69 | generate a pure (=reentrant) parser for perly.y. So our yacc is |
| 70 | really the following script: |
| 71 | |
| 72 | -----8<-----/usr/local/bin/yacc-----8<----- |
| 73 | #! /usr/bin/sh |
| 74 | |
| 75 | # Bison as a reentrant yacc: |
| 76 | |
| 77 | # save parameters: |
| 78 | params="" |
| 79 | while [[ $# -gt 1 ]]; do |
| 80 | params="$params $1" |
| 81 | shift |
| 82 | done |
| 83 | |
| 84 | # add flag %pure_parser: |
| 85 | |
| 86 | tmpfile=/tmp/bison.$$.y |
| 87 | echo %pure_parser > $tmpfile |
| 88 | cat $1 >> $tmpfile |
| 89 | |
| 90 | # call bison: |
| 91 | |
| 92 | echo "/usr/local/bin/bison --yacc $params $1\t\t\t(Pure Parser)" |
| 93 | /usr/local/bin/bison --yacc $params $tmpfile |
| 94 | |
| 95 | # cleanup: |
| 96 | |
| 97 | rm -f $tmpfile |
| 98 | -----8<----------8<----- |
| 99 | |
| 100 | We still use the normal yacc for a2p.y though!!! We made a softlink |
| 101 | called byacc to distinguish between the two versions: |
| 102 | |
| 103 | ln -s /usr/bin/yacc /usr/local/bin/byacc |
| 104 | |
| 105 | We build perl using GNU make. We tried the native make once and it |
| 106 | worked too. |
| 107 | |
| 108 | =head2 Testing Perl on BS2000 |
| 109 | |
| 110 | We still got a few errors during C<make test>. Some of them are the |
| 111 | result of using bison. Bison prints I<parser error> instead of I<syntax |
| 112 | error>, so we may ignore them. The following list shows |
| 113 | our errors, your results may differ: |
| 114 | |
| 115 | op/numconvert.......FAILED tests 1409-1440 |
| 116 | op/regexp...........FAILED tests 483, 496 |
| 117 | op/regexp_noamp.....FAILED tests 483, 496 |
| 118 | pragma/overload.....FAILED tests 152-153, 170-171 |
| 119 | pragma/warnings.....FAILED tests 14, 82, 129, 155, 192, 205, 207 |
| 120 | lib/bigfloat........FAILED tests 351-352, 355 |
| 121 | lib/bigfltpm........FAILED tests 354-355, 358 |
| 122 | lib/complex.........FAILED tests 267, 487 |
| 123 | lib/dumper..........FAILED tests 43, 45 |
| 124 | Failed 11/231 test scripts, 95.24% okay. 57/10595 subtests failed, 99.46% okay. |
| 125 | |
| 126 | =head2 Installing Perl on BS2000 |
| 127 | |
| 128 | We have no nroff on BS2000 POSIX (yet), so we ignored any errors while |
| 129 | installing the documentation. |
| 130 | |
| 131 | |
| 132 | =head2 Using Perl in the Posix-Shell of BS2000 |
| 133 | |
| 134 | BS2000 POSIX doesn't support the shebang notation |
| 135 | (C<#!/usr/local/bin/perl>), so you have to use the following lines |
| 136 | instead: |
| 137 | |
| 138 | : # use perl |
| 139 | eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' |
| 140 | if $running_under_some_shell; |
| 141 | |
| 142 | =head2 Using Perl in "native" BS2000 |
| 143 | |
| 144 | We don't have much experience with this yet, but try the following: |
| 145 | |
| 146 | Copy your Perl executable to a BS2000 LLM using bs2cp: |
| 147 | |
| 148 | C<bs2cp /usr/local/bin/perl 'bs2:perl(perl,l)'> |
| 149 | |
| 150 | Now you can start it with the following (SDF) command: |
| 151 | |
| 152 | C</START-PROG FROM-FILE=*MODULE(PERL,PERL),PROG-MODE=*ANY,RUN-MODE=*ADV> |
| 153 | |
| 154 | First you get the BS2000 commandline prompt ('*'). Here you may enter |
| 155 | your parameters, e.g. C<-e 'print "Hello World!\\n";'> (note the |
| 156 | double backslash!) or C<-w> and the name of your Perl script. |
| 157 | Filenames starting with C</> are searched in the Posix filesystem, |
| 158 | others are searched in the BS2000 filesystem. You may even use |
| 159 | wildcards if you put a C<%> in front of your filename (e.g. C<-w |
| 160 | checkfiles.pl %*.c>). Read your C/C++ manual for additional |
| 161 | possibilities of the commandline prompt (look for |
| 162 | PARAMETER-PROMPTING). |
| 163 | |
| 164 | =head2 Floating point anomalies on BS2000 |
| 165 | |
| 166 | There appears to be a bug in the floating point implementation on BS2000 POSIX |
| 167 | systems such that calling int() on the product of a number and a small |
| 168 | magnitude number is not the same as calling int() on the quotient of |
| 169 | that number and a large magnitude number. For example, in the following |
| 170 | Perl code: |
| 171 | |
| 172 | my $x = 100000.0; |
| 173 | my $y = int($x * 1e-5) * 1e5; # '0' |
| 174 | my $z = int($x / 1e+5) * 1e5; # '100000' |
| 175 | print "\$y is $y and \$z is $z\n"; # $y is 0 and $z is 100000 |
| 176 | |
| 177 | Although one would expect the quantities $y and $z to be the same and equal |
| 178 | to 100000 they will differ and instead will be 0 and 100000 respectively. |
| 179 | |
| 180 | =head2 Using PerlIO and different encodings on ASCII and EBCDIC partitions |
| 181 | |
| 182 | Since version 5.8 Perl uses the new PerlIO on BS2000. This enables |
| 183 | you using different encodings per IO channel. For example you may use |
| 184 | |
| 185 | use Encode; |
| 186 | open($f, ">:encoding(ascii)", "test.ascii"); |
| 187 | print $f "Hello World!\n"; |
| 188 | open($f, ">:encoding(posix-bc)", "test.ebcdic"); |
| 189 | print $f "Hello World!\n"; |
| 190 | open($f, ">:encoding(latin1)", "test.latin1"); |
| 191 | print $f "Hello World!\n"; |
| 192 | open($f, ">:encoding(utf8)", "test.utf8"); |
| 193 | print $f "Hello World!\n"; |
| 194 | |
| 195 | to get two files containing "Hello World!\n" in ASCII, EBCDIC, ISO |
| 196 | Latin-1 (in this example identical to ASCII) respective UTF-EBCDIC (in |
| 197 | this example identical to normal EBCDIC). See the documentation of |
| 198 | Encode::PerlIO for details. |
| 199 | |
| 200 | As the PerlIO layer uses raw IO internally, all this totally ignores |
| 201 | the type of your filesystem (ASCII or EBCDIC) and the IO_CONVERSION |
| 202 | environment variable. If you want to get the old behavior, that the |
| 203 | BS2000 IO functions determine conversion depending on the filesystem |
| 204 | PerlIO still is your friend. You use IO_CONVERSION as usual and tell |
| 205 | Perl, that it should use the native IO layer: |
| 206 | |
| 207 | export IO_CONVERSION=YES |
| 208 | export PERLIO=stdio |
| 209 | |
| 210 | Now your IO would be ASCII on ASCII partitions and EBCDIC on EBCDIC |
| 211 | partitions. See the documentation of PerlIO (without C<Encode::>!) |
| 212 | for further possibilities. |
| 213 | |
| 214 | =head1 AUTHORS |
| 215 | |
| 216 | Thomas Dorner |
| 217 | |
| 218 | =head1 SEE ALSO |
| 219 | |
| 220 | L<INSTALL>, L<perlport>. |
| 221 | |
| 222 | =head2 Mailing list |
| 223 | |
| 224 | If you are interested in the z/OS (formerly known as OS/390) |
| 225 | and POSIX-BC (BS2000) ports of Perl then see the perl-mvs mailing list. |
| 226 | To subscribe, send an empty message to perl-mvs-subscribe@perl.org. |
| 227 | |
| 228 | See also: |
| 229 | |
| 230 | http://lists.perl.org/list/perl-mvs.html |
| 231 | |
| 232 | There are web archives of the mailing list at: |
| 233 | |
| 234 | http://www.xray.mpe.mpg.de/mailing-lists/perl-mvs/ |
| 235 | http://archive.develooper.com/perl-mvs@perl.org/ |
| 236 | |
| 237 | =head1 HISTORY |
| 238 | |
| 239 | This document was originally written by Thomas Dorner for the 5.005 |
| 240 | release of Perl. |
| 241 | |
| 242 | This document was podified for the 5.6 release of perl 11 July 2000. |
| 243 | |
| 244 | =cut |