.ds RH Recompiling system software
.bp
.nr H1 6
.nr H2 0
.bp
.LG
.B
.ce
6. RECOMPILING SYSTEM SOFTWARE
.sp 2
.R
.NL
.PP
We now describe how to recompile system programs and install them.
Some programs must be modified for the local system at this time,
and other local changes may be desirable now or later.
Before any of these procedures are begun, be certain that the
include files <whoami.h>, <sys/localopts.h> and <sys/param.h> are correct
for the kernel that has been installed.
This is important for commands that wish to know the name of the local
machine or that size their data areas appropriately for the type of
CPU.
The general procedures are given first, followed by more detailed
information about some of the major systems that require some setup.
.NH 2
Recompiling and reinstalling system software
.PP
It is easy to regenerate the system, and it is a good
idea to try rebuilding pieces of the system to build confidence
in the procedures.
The system consists of three major parts:
the kernel itself, along with the bootstrap
and standalone utilities (/usr/src/sys), the user programs
(/usr/src/cmd, /usr/src/ucb, and subdirectories), and the libraries
(/usr/src/lib).
The major part of this is /usr/src/cmd.
.PP
We have already seen how to recompile the system itself.
The commands and libraries can be recompiled in their
respective source directories using the Makefile (or Ovmakefile
if there are both overlaid and non-overlaid versions).
However, it is generally easier to use one of the MAKE scripts
set up for /usr/src/lib, /usr/src/cmd, and /usr/src/ucb.
These are used in a similar fashion, such as
.DS
\fB#\fP ./MAKE\|\| \-40\|\| [ \-cp ]\|\| [ \-f ]\|\| file ...
.DE
The first, required flag sets the CPU class for which to compile.
Three classes are used to used to set requirements for separate
instruction and data and for floating point.
``MAKE\|\| \-40'' makes nonseparate I/D versions that load the floating point
interpreter as required.  ``MAKE\|\| \-34'' is similar but assumes a hardware
floating point unit.  ``MAKE\|\| \-70'' is used for separate I/D machines and
also assumes floating point hardware.  ``MAKE\|\| \-70\|\| \-f'' is used for
separate I/D machines without floating point hardware.
The use of these MAKE scripts automates the selection of CPU-dependent
options and makes the optimal configuration of each program for the target
computer.
The optional argument \-cp causes each program to be installed as it is
made.  They are installed in the normal directories, unless the
environment variable DESTDIR is set, in which case the normal path
is prepended by DESTDIR.  This can be used to compile and create
a new set of binary directories, e.g. /nbsd/bin, /nbsd/lib, etc.
Running the command ``MAKE\|\| \-70\|\| \-cp *'' in /usr/src/lib, /usr/src/cmd
and /usr/src/ucb would thus create a whole new tree of system binaries.
The six major libraries are the C library in /usr/src/lib/c,
the jobs library, /usr/src/lib/jobs,
the \s-2FORTRAN\s0 libraries /usr/src/lib/libF77, /usr/src/lib/libI77,
and /usr/src/lib/libU77,
and the math library /usr/src/lib/m.
Most libraries are made in two versions, one each for use
with and without process overlays.
In each
case the library is remade by changing into /usr/src/lib
and doing
.DS
\fB#\fP ./MAKE\|\| \-\fIcpu\fP\|\| \fIlibname\fP
.DE
or made and installed by
.DS
\fB#\fP ./MAKE\|\| \-\fIcpu\fP\|\| \-cp\|\| \fIlibname\fP
.DE
Similar to the system,
.DS
\fB#\fP make clean
.DE
cleans up in each subdirectory.
.PP
To recompile individual commands, change to /usr/src/cmd
or /usr/src/ucb, as appropriate, and use the MAKE script in the same way.
Thus to compile adb, do
.DS
\fB#\fP ./MAKE \-\fIcpu\fP adb
.DE
where cpu is 34, 40, or 70.
To recompile everything, use
.DS
\fB#\fP ./MAKE \-\fIcpu\fP *
.DE
After installing new binaries, you can use the script in /usr/src
to link files together as necessary and to set all the right set-user-id
bits.
.DS
\fB#\fP cd /usr/src
\fB#\fP ./MAKE aliases
\fB#\fP ./MAKE modes
.DE
.NH 2
Making local modifications
.PP
To keep track of changes to system source we migrate changed
versions of commands in /usr/src/cmd in through the directory /usr/src/new
and out of /usr/src/cmd into /usr/src/old for a time before removing them.
Locally written commands that aren't distributed are kept in /usr/src/local
and their binaries are kept in /usr/local.  This allows /usr/bin, /usr/ucb,
and /bin to correspond to the distribution tape (and to the manuals that
people can buy).  People wishing to use /usr/local commands are made
aware that they aren't in the base manual.  As manual updates incorporate
these commands they are moved to /usr/ucb.
.PP
A directory /usr/junk to throw garbage into, as well as binary directories
/usr/old and /usr/new are useful.  The \fIman\fP\|(1) command supports manual
directories such as /usr/man/mann for new and /usr/man/manl for local
to make this or something similar practical.
.NH 2
Setting up the mail system
.PP
The mail system can be set up in at least two ways.  One strategy uses the
.IR delivermail (8)
program to sort out network addresses according to the local network
topology.  It is not perfect, especially in the light of changing ARPAnet
conventions.  However, if you use the Berkeley network or are connected
directly or indirectly to the ARPAnet, it is probably the method of choice
for the time being.
On the other hand, if you use only local mail and UUCP mail, /bin/mail (\c
.IR mail (1))
will suffice as a mail deliverer.
In that case, you will only need to recompile
.IR mail (1)
and
.IR Mail (1).
.PP
The entire mail system consists of the following commands:
.DS
.TS
l l.
/bin/mail	old standard mail program (from V7 or System III)
/usr/ucb/Mail	UCB mail program, described in Mail(1)
/usr/lib/Mail.rc	aliases and defaults for Mail(1)
/etc/delivermail	mail routing program
/usr/net/bin/v6mail	local mailman for berknet
/usr/spool/mail	mail spooling directory
/usr/spool/secretmail	secure mail directory
/usr/bin/xsend	secure mail sender
/usr/bin/xget	secure mail receiver
/usr/lib/aliases	mail forwarding information for delivermail
/usr/ucb/newaliases	command to rebuild binary forwarding database
.TE
.DE
Mail is normally sent and received using the
.IR Mail (1)
command, which provides a front-end to edit the messages sent
and received, and passes the messages to
.IR delivermail (8)
or
.IR mail (1)
for routing and/or delivery.
.PP
Mail is normally accessible in the directory /usr/spool/mail and is readable
by all users.\(dg
.FS
\u\(dg\d You can make your mail unreadable by others by changing the mode
of the file /usr/spool/mail/\fIyourname\fR to 600 and putting the line
``set keep'' in your .mailrc file.
The directory /usr/spool/mail must not be writable (mode 755) for this to work.
.FE
To send mail which is secure against any possible
perusal (except by a code-breaker) you should
use the secret mail facility, which encrypts the mail
so that no one can read it.
.NH 3
Setting up mail and Mail
.PP
Both /bin/mail and /usr/ucb/Mail should be recompiled
to make local versions.
Remake mail in /usr/src/cmd with the command
.DS
\fB#\fP ./MAKE \-\fIcpu\fP mail
.DE
Install the new binary in /bin after testing; it must be setuserid root.
Section 6.1 gives more details on the use of the MAKE scripts.
To configure \fIMail\fP, change directories to /usr/src/ucb/Mail.
Edit the file v7.local.h to assign a letter to your machine
with the definition of LOCAL; if you do not have a local area network,
the choice is arbitrary as long as you pick an unused letter.
If you wish to use \fIdelivermail\fP, the definition of SENDMAIL should
be uncommented.
Then add your machine to the table in config.c; configdefs.h gives
some information on this.  The network field should specify which
networks (if any) you are connected to (note: the Schmidt net, SN,
is Berknet).
After the changes are made, move to /usr/src/ucb and
.DS
\fB#\fP ./MAKE \-40 Mail	(on a nonseparate I/D machine)
  or
\fB#\fP ./MAKE \-70 Mail	(on a separate I/D machine)
.DE
Install \fIMail\fP in /usr/ucb; it should \fBnot\fP be setuserid.
The Mail.rc file in /usr/lib can be used to set up limited distribution
lists or aliases if you are not using \fIdelivermail\fP.
.NH 3
Setting up delivermail
.PP
To set up the \fIdelivermail\fP facility you should read the instructions in the
file READ_ME in the directory /usr/src/ucb/delivermail and then adjust
and recompile the \fIdelivermail\fP program, installing it as /etc/delivermail.
The routing algorithm uses knowledge of network name syntax built
into its tables and aliasing and forwarding information built into
the file /usr/lib/aliases to process each piece of mail.
Local mail is delivered by giving it to the program /usr/net/bin/v6mail
which adds it to the mailboxes in the directory /usr/spool/mail/\fIusername\fP,
using a locking protocol to avoid problems with simultaneous updates.
You should also set up the file /usr/lib/aliases for your installation,
creating mail groups as appropriate.
.NH 2
Setting up a uucp connection
.PP
To connect two UNIX machines with a \fIuucp\fP network link using modems,
one site must have a automatic call unit and the other must have a
dialup port.  It is better if both sites have both.
.PP
You should first read the paper in volume 2B of the UNIX Programmers Manual:
``Uucp Implementation Description.''  It describes in detail the file
formats and conventions, and will give you a little context.
For any configuration, you must recompile all system dependent programs.
.PP
Change directory to /usr/src/cmd/uucp and examine uucp.h, making any necessary
changes.
Recompile uucp with ``make'' and su to ``make install.''
.PP
You should ensure that the directories
/usr/spool/uucp and /usr/spool/uucppublic exist.
The former should be owned by uucp, mode 755 (or 777 is OK) and the
latter should be mode 777 (and the home directory for login uucp).
.PP
Periodically you should clean out /usr/spool/uucp and /usr/spool/uucppublic,
as they can accumulate junk, especially if you don't have a dialer.
Run ``uulog'' once a day, and ``/usr/lib/uucp/uuclean'' periodically with
appropriate options to get rid of old stuff.\(dg
.FS
\u\(dg\d The
\fIcron\fP\|(8)
program can arrange to execute these commands periodically.
.FE
You can also just remove
some of the files in /usr/spool/uucp, but if you do this blindly you
will cause some error messages to be generated when uucp tries to access
a file another file claims is there.  (For instance, each mail transaction
creates three files.)
The /usr/spool/uucppublic directory
is a place for people at other sites to send to when sending
files to users on your machine.  You should clean it out by hand when
it gets excessive.
.PP
If both sites have both a dialer and dialup:  follow
the directions in the volume 2B paper \- this is the intended
mode of operation and the directions fit well.  You
have to configure the following files in /usr/lib/uucp:
.DS
.TS
l l.
L\|.sys	setup all fields \- this lists the other sites
L-devices	your dialer
USERFILE	permissions \- this can be left alone
.TE
.DE
You must also establish a login ``uucp'' in /etc/passwd with shell
/usr/lib/uucp/uucico.  Each site must know the other site's phone
number, login, and password.
.PP
If you have only a dialup:
you can be a second-class citizen on the uucp net.  You must find
another site that has a dialer, and have them poll you regularly.
(Once a day is about the minimum that is reasonable.)  When you send
mail to another site, you must wait for them to call you.
You must set up /usr/lib/uucp/USERFILE and /usr/lib/uucp/L\|.sys.
Only the first 4 fields of L\|.sys
are necessary, and in practice only the first field (site name) is
looked at.  A typical L\|.sys for a passive node might be:
.DS
.TS
l l.
ucbvax	Any \fIACU\fP 300
research	Any \fIACU\fP 300
.TE
.DE
where the first field on each line is a site that will poll you
and \fIACU\fP is either ``ACU'' or ``DIR.''
You need to put a password on the uucp login and let the other site know
your phone number, uucp login name (which is usually uucp), and password.
It doesn't matter whether they call you at 300 or 1200 baud.
.PP
If you have a dialer and want to poll another site:  normally,
uucp will call the other site when it has anything to send it,
and while it's at it will check to see if anything should come back.
The command
.DS
/usr/lib/uucp/uucico \-r1 \-sucbvax
.DE
will force \fIuucp\fP to poll ucbvax, even if there is nothing waiting.
This command can be conveniently put in /usr/lib/crontab to run
early each morning.
If you are having trouble with the connection, invoke uucico by hand:
.DS
/usr/lib/uucp/uucico \-r1 \-sucbvax \-x7
.DE
where the \fB-x\fP option turns on debugging output.  The higher the number,
the more debugging output you get; 1, 4, and 7 are reasonable choices.
.NH 2
Miscellaneous software
.PP
The directory /usr/contrib contains programs and packages that you may wish to
install on your system.  Also, some programs or libraries in the \fIucb\fP
directory are sufficiently unique to be noteworthy.
Here is a brief summary.
.NH 3
Ape
.PP
\fIApe\fP (\fIA\fPrbitrary \fIP\fPrecision \fIE\fPxtended) is a replacement
for the multiple precision arithmetic routines (\fImp\fP\|(3)).  It is much
faster and contains numerous bug fixes.
.NH 3
L11, M11
.PP
\fIM11\fP is a Macro-11 assembler.  It recognizes and emulates almost all
of the directives of standard DEC Macro-11 assemblers.  \fIL11\fP is its
loader.
.NH 3
Jove
.PP
\fIJove\fP (\fIJ\fPonathan's \fIO\fPwn \fIV\fPersion of \fIE\fPMACS)
is an EMACS style editor developed at Lincoln Sudbury Regional High School.
.NH 3
News
.PP
The network bulletin board system developed at Duke University
and the University of North Carolina and since heavily modified at Berkeley.
.NH 3
Notes
.PP
The network bulletin board system developed at the University of Illinois.
This version contains many enhancements and clean \fInews\fP interfaces.
.NH 3
Ranm
.PP
\fIRanm\fP is a fast uniform pseudorandom number generator package
developed at Berkeley.
