Welcome!
========

This directory contains sources and documentation for GNU RCS.

GNU RCS (Revision Control System) manages multiple revisions of files.
RCS can store, retrieve, log, identify, and merge revisions.
It is useful for files that are revised frequently, e.g.,
programs, documentation, graphics, and papers.

See the following files and directories for more information.

 AUTHORS - authorship information
 COPYING - copying conditions
 INSTALL - generic installation instructions
 NEWS    - recent changes
 doc/    - documentation in info format, plus source (texinfo)
 lib/    - portability code, from gnulib
 m4/     - configure script infrastructure, from gnulib
 man/    - manual page entries, plus source
 src/    - source code for programs
 tests/  - test suite



Prerequisites and compatibility issues
======================================

RCS requires a diff that supports the -n option.
Get GNU diffutils (version 2.7 or later) if your diff lacks -n.

RCS works best with a diff that supports -a and --label,
and a diff3 that supports -A, -E and -m.
GNU diffutils supports these options.

RCS version 5 reads RCS files written by any RCS version released
since 1982.  It also writes RCS files that these older versions of
RCS can read, unless you use one of the following new features:

- checkin dates after 1999-12-31
- checking in non-text files
- identifiers containing ‘.’ or non-ASCII bytes, or starting with a digit
- ‘rcs -bX’, where X is nonempty
- ‘rcs -kX’, where X is not ‘kv’
- RCS files that exceed hardcoded limits in older RCS versions

A working file written by RCS 5.5 or later contains four-digit years in its
keyword strings.  If you check out a working file with RCS 5.5 or later, an
older RCS version's ‘ci -k’ may insist on two-digit years.  Similarly, a
working file written with ‘-zZONE’ contains times in its keyword strings
that older ‘ci -k’s may not understand.  Work around this with ‘co -V4 -z’,
or edit the working file.

RCS should run on any host that conforms to the POSIX 1003.1-1990 standard.
It also runs on a wide variety of non-POSIX hosts.



Configuration and installation
==============================

See INSTALL for general instructions on configuring and building RCS.
Use ‘configure --help’ to see a list of options for customizing the
installation directories (.e.g, --prefix).

* --with-mailer=PROGRAM

  This specifies that PROGRAM (an absolute filename if not findable on PATH)
  should be used to send mail to the original locker when a lock is broken.
  PROGRAM will be called with one argument, the recipient, and its standard
  input will be:

    Subject: Broken lock on <FILENAME>

    <REASON>

  That is, the first line is the subject, followed by an empty line, followed
  by the message body.  Omitting this option disables sending mail.

* --disable-mmap

  For speed, RCS uses mmap(2) if available.  Unfortunately, many mmap
  implementations are broken.  For instance, mmap does not work properly
  in HP-UX 8 or 9, or in Solaris 2.4, without kernel patches.  We don't
  know details about the bugs, so we can't test for them automatically.
  This option arranges to build RCS without mmap.

* --disable-suid / --enable-suid=setreuid

  By default, RCS uses seteuid(2) to run its commands setuid.

  If your ‘seteuid’ (typically on older BSDs, e.g., SunOS 3.5) does not let
  you switch back and forth between any pair of users as specified in POSIX
  1003.1a Draft 5, you should specify ‘--enable-suid=setreuid’, instead.
  (One must be root to test this reliably, so the configure script just
  checks availability.)

  To build RCS without setuid support, specify ‘--disable-suid’.

  !!! NB: Support for setuid operation will be removed in GNU RCS 6.x.

  !!! NB: Don't run RCS setuid under AIX 3.2 if you use NFS, since it's badly
  broken.  To see the AIX 3.2 bug, run the following program setuid X where
  the NFS file "abc" already exists, owned by X, permission -rw-r--r--, and
  where the invoker is not X.

    #include <stdio.h>

    int
    main ()
    {
      FILE *f = fopen ("abc", "w");

      setuid (getuid ());
      fputc ('\n', f);
      if (fclose (f) != 0)
        perror ("fclose");
    }

  The program fails with "fclose: Permission denied".

If your system type is in the following list, look for the
corresponding strings in the notes below before configuring.

  system type         - identifiers
  ------------------------------------
  AIX 3.2             - --prefix=/usr
  GCC 2.5.8 Intel x86 - CFLAGS
  HP-UX 8.07 and 9.*  - MMAP_SIGNAL
  Solaris 2.4         - MMAP_SIGNAL
  SCO Unix V.3.2      - bad_NFS_rename
  Ultrix              - HAVE_SETEUID

If the configure script tells you that your platform might be desupported in
the future, then consider yourself very lucky!  As a courageous builder of
free software you are now empowered to clue in the RCS maintainer on the
desirability of continued support for your platform, thereby quietening your
fears and increasing the connectedness of the RCS-using community.

You do this by mailing the warning text output by the configure script
to bug-rcs@gnu.org, with a suitably detailed (i.e., optional) explanation
of your platform, including why it should (or shouldn't) be supported.

If building succeeds, do "make check" (optional) and "make install".
To check the installation, do "make installcheck".

AIX NOTE:
Do not configure with ‘--prefix=/’ or ‘--prefix=/usr’ in AIX.
An AIX boot shell script (/etc/rc.boot4 in AIX 3.2) invokes ‘merge’,
meaning /etc/merge, and fails if RCS merge is installed in /bin or /usr/bin.
IBM says that installing new programs into /usr/bin is a customer error (!).



Configuration environment
=========================

The configuration procedure normally inspects the current host to determine
how RCS is to be built.  The variables listed in this section override this
default.  They should be specified on the configure script command-line,
like so:

$ ./configure [--prefix and other options...] VAR=VALUE VAR=VALUE

CC is the name of your C compiler.

CPPFLAGS are C preprocessor options.

CFLAGS are C compiler options that do not affect correctness,
typically options that affect optimization or debugging.
Omit -O if your compiler's optimizer is not trustworthy (e.g. GCC 2.5.8 x86).
If your ancient BSD compiler has the -R option, -R can improve performance by
making all initialized data read-only (not just string literals);
modern compilers don't need this, since they have ‘const’.

DIFF is the name of your diff program.
It's normally best to use GNU diffutils.
On some versions of Unix, the standard diff does not support RCS
and you must instead use diffutils, or something like /usr/lib/rdiff.

DIFF3 is the name of the diff3 program.
With GNU diffutils, this is simply its user-visible diff3 program.
But with traditional diff3 it is the name of the undocumented diff3 auxiliary,
whose name is /usr/lib/diff3 or /usr/5lib/rdiff3prog or something similar.

SOELIM is the name of your soelim program.
This is typically the standard one from groff.
It is used only if you edit man/*.[15]in or make ‘maintainer-clean’.

PIC is the name of your pic program, configured to avoid extensions
so that a portable man page is generated.
This is typically GNU pic with the ‘-n’ option,
or traditional pic with ‘-D’.
It is used only if you edit the documentation or make ‘maintainer-clean’.

Other variables are mentioned in the output of ‘./configure --help’.



cross-compilation
=================

There are several variables set by the configure script that are assigned
"pessimistic" defaults when cross-compiling (info "(autoconf) Runtime"):

 (variable)                (value)
  rcs_cv_tinyinit_ok        no
  rcs_cv_fopen_truncates    no
  rcs_cv_wac_ok             no
  rcs_cv_unlink_mw_ok       no
  rcs_cv_rename_mw          hopeless
  rcs_cv_sane_mmap          no
  rcs_cv_mmap_signal        unknown
  rcs_cv_tolerant_wait      no

To set the "correct" value for a particular VAR, overriding its default, you
can specify VAR=VALUE on the configure script command-line.  For example:

 ./configure \
    rcs_cv_tinyinit_ok=yes \
    rcs_cv_unlink_mw_ok=no

Note that the value of ‘rcs_cv_mmap_signal’ has meaning only if
‘rcs_cv_sane_mmap’ is ‘yes’.  Valid values are documented only in the
configure script source, i.e., configure.ac -- don't guess, use the Source!

You will most likely also need to specify GNU diffutils programs diff(1)
and diff3(1) using vars ‘DIFF’ and ‘DIFF3’, respectively.  The values should
be absolute filenames *on the target system*.  If those are specified, the
configure script skips the related tests and assumes the following defaults:

 (variable)                   (value)
  rcs_cv_sane_DIFF             yes
  rcs_cv_status_diff_success   0
  rcs_cv_status_diff_failure   1
  rcs_cv_status_diff_trouble   2
  rcs_cv_options_diff          -an
  rcs_cv_options_diff_l        yes
  rcs_cv_sane_diff3            yes

Values are optimistic, unlike for the vars described at the beginning of
this section, but anyway can be overridden in the usual manner.

Another variable is ‘rcs_cv_LOGNAME_ro’ with optimistic value "no", which
controls the order of the env vars consulted (normally LOGNAME before USER).
If "yes", RCS is built to consult USER before LOGNAME.

If you get good results cross-compiling, with or without such variable
overrides, please consider sharing the good news by posting the configure
script invocation to the bug-report address with subject "cross-compilation
success" or similar.



src/base.h notes
================

This section covers unusual situations requiring hand patches to src/base.h.

bad_NFS_rename - Some buggy NFS file servers (e.g. some NAC releases)
can report that rename(A,B) succeeded even though it failed.
Set bad_NFS_rename to nonzero to work around the problem.
Warning: the workaround introduces a rare race condition
that can falsely report I/O errors;
this is why the workaround is disabled unless you specify otherwise.
For SCO Unix V.3.2, this should be 1.  Its NFS rename(2) is broken,
but if configure runs in a non-NFS file system, it thinks rename(2) works.

has_NFS - Set this if the target host might use NFS.
NFS's ``stateless server'' protocol has well-known problems with
the non-idempotent operations link(2), rename(2), and unlink(2).
For example, unlink(2) can run twice on the NFS server,
causing the client to think that the unlink failed with errno==ENOENT.
has_NFS enables code that works around these problems.
However, has_NFS does not work around NFS implementation bugs;
if your NFS implementation is buggy, get another!
For example, make sure that your NFS uses UDP checksums, if it uses UDP.
Modern systems checksum by default; ask your vendor if you're not sure.

TZ_must_be_set - set this to 1 on hosts where gmtime(3) yields bogus
values unless the TZ environment variable is set.


Copyright (C) 2010-2022 Thien-Thi Nguyen

Copying and distribution of this file, with or without modification,
are permitted provided the copyright notice and this notice are preserved.
