BUILDING THE PD KSH
===================

As usual, there are differences between BSD and System V
versions.  Ideally, all you have to do is edit the Makefile in
this directory to set the CONFIG macro to the appropriate value.
(Actually, you may wish to change the CONFIG macro in all
Makefiles; if you always invoke make(1) from here, CONFIG will
be passed down, but if you invoke make(1) from a subdirectory
you'll want the appropriate definition in that Makefile.)

Of course it's not quite that simple.  You may, however, take
solace in the knowledge that it used to be worse.

The Compatibility Libraries
---------------------------

Eric Gisin wrote this shell using ANSI C and POSIX as
portability guidlines.  Realizing that nobody had a POSIX
system and almost no one had an ANSI C environment, he provided
minimal compatibility libraries.

There are two libraries, one for POSIX (libposix.a) and one for
ANSI C (libstdc.a).

Libposix.a is pretty simple.  Nothing in it has ever broken on
me, so I'd just leave it.  It provides a version of dup2() for
System V systems.

Libstdc.a is a bit hairy.  I recommend looking at the routines
provided and, and editing the std/stdc Makefile and only
including objects that have routines your system libc.a is
lacking.  Various of the provided routines are just plain
flaky, but only when they're not really needed.  The other
hairy thing he does is craft an ANSI stdio.h from the system
supplied one and one of his own.  Again, it's better than it
used to be, but it's still a hack, and you may have to modify
it by hand.

You will also need a POSIX compatible set of directory reading
routines.  System V.3 systems have this in libc.a.  The
std/posix directory provides a something for BSD systems.  I
use a slightly modified version of Doug Gwyn's PD version.

(The ``slightly modified'' is to work around a bug in Gwyn's version.
The POSIX routines are documented as returning failure if the file for
opendir(3) is not a directory.  Gwyn attempts to open(2) the file, and
then stats it to see if the file is a directory.  However, if the file
is a special file, and the open(2) doesn't return, you're screwed.  My
change was to open the file with the O_NDELAY flag, but Gwyn didn't
feel this was portable (true, but I only do it where it works) and
that stat-ing before the open would be too slow (true).  The upshot is
if you use his routines unmodified, don't ever do an "ls -l /dev/*/*".)

The Shell Source
----------------

The source for the shell itself is in the sh directory.  There you
will want to edit config.h to determine the configuration options.  Vi
mode is in kind of rough shape, but does work.  DIRSTACK routines
aren't implemented yet, so again, why bother.  SWTCH is a bit arcane,
but it you use shl(1) and you define EMACS or VI you want to define
this.  JOBS is really only useful on BSD systems.  It might work on
systems that have POSIX job control, but I wouldn't bet on it.
SHARPBANG is only useful on systems where the exec() family don't
honour the #!/prog/path convention.

This is where the shell gets built so you may wish to change
the OTHERLIBS macro in the Makefile to point to your POSIX
directory routines, or to use -lc_s, or whatever.

Miscellaneous
-------------

The Makefiles that actually compile things use the macro
CCOPTS, so you can change it in individual Makefiles or specify
it on the command line, eg. "make CCOPTS=-O OTHERLIBS=-lc_s".
LDOPTS is used in the Makefile where the ksh is actually built.

The very first time on a new system, do a "make clobber"

Good luck.

Documentation
-------------

The ksh.1 is a man page for the PD ksh, although it lags
somewhat behind the code.  You get what you pay for.

The ksh88.1 is a man page for AT&T's ksh88 (the latest version)
provided for comparison.

History
-------

Much of the shell was written by Eric Gisin at the University
of Waterloo, using some pieces of other stuff, notably Charles
Forsythe's V7 shell, and some enhancements from the BRL shell.
He placed it (in a alpha test state) into the public domain
while I was at UW.  I snarfed a copy, and got it running on my
UNIXpc, and later some machines at work.  I sent Gisin some bug
reports, but he seems to have lost interest in the project.
This may be because he now does some work for MKS, who produce a
commercial version of the ksh for MS-DOS machines, so there may
be a conflict of interest.

So I gave up on getting future versions, and adopted it.  I've
made some enhancements, and quite a few bug fixes, and various
people at work have contributed as well.  It remains in the
public domain, although I imagine the people involved would
appreciate leaving their names attached (I'm exempt; I haven't
actually included my name anywhere but here).

The README in the sh directory is Gisin's, and tells a bit of
the story from his point of view.  Note that his compilation
instructions don't really apply anymore.

John R. MacMillan
