
  APACHE INSTALLATION OVERVIEW

  Quick Start - Unix
  ------------------

  For complete installation documentation, see [ht]docs/manual/install.html or
  http://httpd.apache.org/docs/trunk/install.html

     $ ./configure --prefix=PREFIX
     $ make
     $ make install
     $ PREFIX/bin/apachectl start

     NOTES: * Replace PREFIX with the filesystem path under which 
              Apache should be installed.  A typical installation
              might use "/usr/local/apache2" for PREFIX (without the
              quotes).

            * Read the section "APR - Unix" below.

            * If you are a developer building Apache directly from
              Subversion, you will need to run ./buildconf before running
              configure. This script bootstraps the build environment and
              requires Python as well as GNU autoconf and libtool. If you
              build Apache from a release tarball, you don't have to run
              buildconf.

            * If you want to build a threaded MPM (for instance worker)
              on  FreeBSD, be aware that threads do not work well with
              Apache on FreeBSD versions before 5.4-RELEASE. If you wish
              to try a threaded Apache on an earlier version of FreeBSD,
              use the --enable-threads parameter to ./configure in
              addition to the --with-mpm parameter.

            * If you are building directly from Subversion on Mac OS X
              (Darwin), make sure to use GNU Libtool 1.4.2 or newer. All
              recent versions of the developer tools on this platform
              include a sufficiently recent version of GNU Libtool (named
              glibtool, but buildconf knows where to find it).

  For a short impression of what possibilities you have, here is a
  typical example which configures Apache for the installation tree
  /sw/pkg/apache with a particular compiler and flags plus the two
  additional modules mod_rewrite and mod_speling for later loading
  through the DSO mechanism:

     $ CC="pgcc" CFLAGS="-O2" \
     ./configure --prefix=/sw/pkg/apache \
     --enable-rewrite=shared \
     --enable-speling=shared 

  The easiest way to find all of the configuration flags for Apache 2.5
  is to run ./configure --help.

  APR - Unix
  ----------

  httpd trunk (httpd development version 2.5) can use APR trunk (future
  APR version 2.0) or the combination of the current APR 1.x branch and
  the current APR-util 1.x branch.  (APR trunk bundles the features in
  APR-util 1.x.)

  The httpd buildconf step, required when building httpd from Subversion,
  must have access to the APR source.  The httpd configure step, always
  required, can configure the APR source in srclib or use a previously-
  built APR.

  APR (and APR-util if using APR 1.x) can be built with httpd from httpd's
  srclib directory or can be built separately, prior to building httpd.
 
  Building APR with httpd from httpd's srclib directory is required if
  you don't have the compiler which the system APR was built with, and it
  can also be advantageous if you are a developer who will be linking your
  code with httpd or using a debugger to step through server code, as it
  removes the possibility of version or compile-option mismatches with
  APR and APR-util code.

  To use APR trunk in srclib:

    Check out APR trunk in srclib/apr with the following command:

    svn co http://svn.apache.org/repos/asf/apr/apr/trunk srclib/apr

    buildconf will find it automatically.  Use the --with-included-apr
    argument to httpd configure.

  To use APR 1.x and APR-util 1.x in srclib:

    Check out the current branches as srclib/apr and srclib/apr-util with
    the following commands:

    svn co http://svn.apache.org/repos/asf/apr/apr/branches/1.7.x srclib/apr
    svn co http://svn.apache.org/repos/asf/apr/apr-util/branches/1.6.x srclib/apr-util

    buildconf will find them automatically.  Use the --with-included-apr
    argument to httpd configure.

  To use existing checkouts of APR (and APR-util if using APR 1.x):

    httpd buildconf must have access to the source trees.  Use these arguments
    to httpd buildconf:

    --with-apr=[path to apr source] --with-apr-util=[path to apr-util source]
  
    (Omit --with-apr-util if using APR trunk.)

    httpd configure must have access to a previously build apr.  Use these
    arguments to httpd configure:

    --with-apr=[path to apr install] --with-apr-util=[path to apr-util install]
  
    (Omit --with-apr-util if using APR trunk.)


  Quick Start - Windows
  ---------------------

  For complete documentation, see manual/platform/windows.html.en or
  <http://httpd.apache.org/docs/trunk/platform/windows.html>


  Postscript
  ----------

  To obtain help with installation problems, please see the resources at
  <http://httpd.apache.org/support.html>

  Thanks for using the Apache HTTP Server, version 2.5.

                                     The Apache Software Foundation
                                     http://www.apache.org/
