If you read this file _as_is_, just ignore the funny characters you
see. It is written in the POD format (see perlpod manpage) which is
specially designed to be readable as is.

=head1 NAME

perluts - Perl under UTS

=head1 SYNOPSIS

This document can be read I<as is>: as F<README.uts>, or you
can read it after you build your package using "man perluts".

The purpose is to help you build Perl for UTS, which, if you
follow these instructions, should be easy, and result in
a solidly working installation.

=head1 DESCRIPTION

Perl 5.7.2 (Developmental) or Perl 5.8.x (forthcoming) for UTS

=head1 BUILDING PERL ON UTS

NOTE: Some sites have redefined the way uname works, and if yours
does this, special steps must be taken so that Configure can
recognize your system as a UTS system.  To see if you are in
this category, issue the command "uname -a".  It should look
something like:

  uts juno 4 4.4 9672 370

At any rate, the first field should be "uts".  If this is not
the case; supposing it is, say telcoUTS, create a script, uts/uname
(i.e. uname, in the subdirectory "uts" of the main Perl source dir):
   # uname
   /usr/bin/uname "$@" | sed -e 's/^telcoUTS/uts/'

and when you execute Configure, do it as below, except for adding
PATH=uts:$PATH as a prefix.  I.e. do:

   PATH=uts:$PATH ./Configure ...

There is no need to do an interactive configure, just type

  ./Configure -de [-Dusedevel] [-Doptimize=-g ] 2>&1 | tee Conf.out

"-Dusedevel" may be required to configure Perl 5.7.2 non-interactively.
Use -Doptimize=-g if you want to run Perl under sdb or gdb, OR
if you want to be able to use the -D command line flags to perl,
which are occasionally useful in debugging perl scripts.

In this and the following steps, the "2>&1 | tee XXX.out" records all
output from the process, which will be useful if anything unexpected
goes wrong.

Then do the compilation with

  make 2>&1 | tee make.out

Finally, test using

  make test 2>&1 | tee make-test.out

In the output, the only failures you should see should look like:

   lib/Math/BigInt/t/bigfltpm.........Use of uninitialized value ...
   FAILED at test 57
   lib/Math/BigInt/t/bigintc..........ok
   lib/Math/BigInt/t/bigintpm.........FAILED at test 204
   lib/Math/BigInt/t/mbimbf...........Use of uninitialized value ...
   Illegal division by zero at ../lib/Math/BigInt/Calc.pm line 314.
   FAILED at test 71
   lib/Math/Complex...................exp: OVERFLOW
   FAILED at test 250
   lib/Math/Trig......................exp: OVERFLOW
   ok
   lib/Memoize/t/array................ok
   	...
   lib/Net/protoent...................ok
   lib/Net/servent....................FAILED at test 0

This means that everything passes except for some problems in the
packages "Math::BigInt", "Math::Complex", and "Math::Trig".
The lib/Net/servent failure seems to be a bug in the test
program.  To confirm this, from the main Perl source dir, do:

   LD_LIBRARY_PATH=`pwd` ./perl -Ilib lib/Net/servent.t

and it should output

   1..3
   ok 1
   ok 2
   ok 3

=head1 Installing the built perl on UTS

Run the command "make install"

=head1 AUTHOR

   Hal Morris
   UTS Global LLC
   email: hom00@utsglobal.com

=cut

