
                                 Apache
                             Version 2.0 (and up)

  What is it?
  -----------

  Apache is an HTTP server designed as a plug-in replacement for
  the NCSA server version 1.3 (or 1.4). It fixes numerous bugs in
  the NCSA server and includes many frequently requested new
  features, and has an API which allows it to be extended to meet
  users' needs more easily.

  The Latest Version
  ------------------

  Details of the latest version can be found on the Apache HTTP
  server project page under http://httpd.apache.org/.

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

  The documentation available as of the date of this release is
  also included, in HTML format, in the htdocs/manual/ directory.
  For the most up-to-date documentation can be found on
  http://httpd.apache.org/docs/.

  Installation
  ------------

  Apache 2.0 uses autoconf for configuration and installation.  To create
  Apache's autoconf script, you will need libtool 1.3.3 or higher, and
  autoconf 2.13 or newer.  Those tools will not be required if you are just
  using a package downloaded from apache.org, they are only required for
  developers.

  To configure Apache 2.0 run the following commands.

  ./buildconf  (not required unless you are a developer)
  ./configure [autoconf arguments] [apache arguments]
  make
  make install
  
  The buildconf script is very important.  Just running autoconf will not
  leave the directory tree in a usable state.

  Licensing
  ---------

  Please see the file called LICENSE.

  Acknowledgments
  ----------------

  We wish to acknowledge the following copyrighted works that
  make up portions of the Apache software:

  Portions of this software were developed at the National Center
  for Supercomputing Applications (NCSA) at the University of
  Illinois at Urbana-Champaign.

  This software contains code derived from the RSA Data Security
  Inc. MD5 Message-Digest Algorithm, including various
  modifications by Spyglass Inc., Carnegie Mellon University, and
  Bell Communications Research, Inc (Bellcore).

  This package contains software written by Philip Hazel and copyrighted by 
  the University of Cambridge.  Please see the file called 
  srclib/pcre/COPYING. 

  The NT port was started with code provided to the Apache Group
  by Ambarish Malpani of ValiCert, Inc. (http://www.valicert.com/).

  Apache 2.0 relies heavily on the use of autoconf and libtool to provide
  a build environment.
