               ======================================
                      INSTALLING SUBVERSION
                          A Quick Guide
               ======================================

$LastChangedDate$


Contents:

     I. INTRODUCTION
       A. Audience
       B. Dependency Overview
       C. Dependencies in Detail
       D. Documentation

    II. INSTALLATION
       A. Building from a Tarball
       B. Building the Latest Source under Unix
       C. Building under Unix in Different Directories
       D. Installing from a Zip or Installer File under Windows
       E. Building the Latest Source under Windows

   III. BUILDING A SUBVERSION SERVER
       A. Setting Up Apache
       B. Making and Installing the Subversion Server
       C. Configuring Apache for Subversion
       D. Running and Testing
       E. Alternative:  'svnserve' and ra_svn

    IV. PLATFORM-SPECIFIC ISSUES
       A. Windows XP
       B. Mac OS X

     V. PROGRAMMING LANGUAGE BINDINGS (PYTHON, PERL, RUBY, JAVA)



I.    INTRODUCTION
      ============

  A. Audience

      This document is written for people who intend to build
      Subversion from source code.  Normally, the only people who do
      this are Subversion developers and package maintainers.

      If neither of these labels fits you, we recommend you find an
      appropriate binary package of Subversion and install that.
      While the Subversion project doesn't officially release binary
      packages, a number of volunteers have made such packages
      available for different operating systems.  Most Linux and BSD
      distributions already have Subversion packages ready to go via
      standard packaging channels, and other volunteers have built
      'installers' for both Windows and OS X.  Visit this page for
      package links:

         http://subversion.apache.org/packages.html

      For those of you who still wish to build from source, Subversion
      follows the Unix convention of "./configure && make", but it has
      a number of dependencies.


  B. Dependency Overview

      You'll need the following build tools to compile Subversion:

      * autoconf 2.59 or later (Unix only)
      * libtool 1.4 or later (Unix only)
      * a reasonable C compiler (gcc, Visual Studio, etc.)


      Subversion also depends on the following third-party libraries:

      * libapr and libapr-util (REQUIRED for client and server)

         The Apache Portable Runtime (APR) library provides an
         abstraction of operating-system level services such as file
         and network I/O, memory management, and so on.  It also
         provides convenience routines for things like hashtables,
         checksums, and argument processing.  While it was originally
         developed for the Apache HTTP server, APR is a standalone
         library used by Subversion and other products.  It is a
         critical dependency for all of Subversion; it's the layer
         that allows Subversion clients and servers to run on
         different operating systems.

      * SQLite  (REQUIRED for client and server)

         Subversion uses SQLite to manage some internal databases.

      * libz  (REQUIRED for client and server)

         Subversion uses zlib for compressing binary differences.
         These diff streams are used everywhere -- over the network,
         in the repository, and in the client's working copy.

      * libserf  (OPTIONAL for client)

         The Serf library allows the Subversion client to send HTTP
         requests.  This is necessary if you want your client to access
         a repository served by the Apache HTTP server.  There is an
         alternate 'svnserve' server as well, though, and clients
         automatically know how to speak the svnserve protocol.
         Thus it's not strictly necessary for your client to be able
         to speak HTTP... though we still recommend that your client
         be built to speak both HTTP and svnserve protocols.

      * OpenSSL (OPTIONAL for client and server)

         OpenSSL enables your client to access SSL-encrypted https://
         URLs (using libserf) in addition to unencrypted http:// URLs.
         To use SSL with Subversion's WebDAV server, Apache needs to be
         compiled with OpenSSL as well.

      * Berkeley DB (OPTIONAL for client and server)

         There are two different repository 'back-end'
         implementations.  One implementation stores data in a flat
         filesystem (known as FSFS); the other implementation stores
         data in a Berkeley DB database (known as BDB).  When you
         create a repository, you have the option of specifying a
         storage back-end.  The Berkeley DB back-end will only be
         available if the BDB libraries are discovered at compile
         time.  The Berkeley DB back-end has been deprecated and
         is not recommend.

      * libsasl (OPTIONAL for client and server)

         If the Cyrus SASL library is detected at compile time, then
         the svn client (and svnserve server) will be able to utilize
         SASL to do various forms of authentication when speaking the
         svnserve protocol.

      * Python, Perl, Java, Ruby  (OPTIONAL)

         Subversion is mostly a collection of C libraries with
         well-defined APIs, with a small collection of programs that
         use the APIs.  If you want to build Subversion API bindings
         for other languages, you need to have those languages
         available at build time.

      * KDELibs, GNOME Keyring  (OPTIONAL for client)

         Subversion contains optional support for storing passwords in
         KWallet (KDE 4) or GNOME Keyring.

      * libmagic (OPTIONAL)

         If the libmagic library is detected at compile time,
         it will be used to determine mime-types of binary files
         which are added to version control. Note that mime-types
         configured via auto-props or the mime-types-file option
         take precedence.

      * Googlemock aka Gmock (OPTIONAL)

         This optional package is used by the tests for Subversions'
         C++ bindings.


  C. Dependencies in Detail

      Subversion depends on a number of third party tools and libraries.
      Some of them are only required to run a Subversion server; others
      are necessary just for a Subversion client.  This section explains
      what other tools and libraries will be required so that Subversion
      can be built with the set of features you want.

      On Unix systems, the './configure' script will tell you if you are
      missing the correct version of any of the required libraries or
      tools, so if you are in a real hurry to get building, you can skip
      straight to section II.  If you want to gather the pieces you will
      need before starting out, however, you should read the following.

      If you're just installing a Subversion client, the Subversion
      team has created a script that downloads the minimal prerequisite
      libraries (Apache Portable Runtime, Sqlite, and Zlib).  The script,
      'get-deps.sh', is available in the same directory as this file.
      When run, it will place 'apr', 'apr-util', 'serf', 'zlib', and
      'sqlite-amalgamation' directories directly into your unpacked Subversion
      distribution.  With the exception of sqlite-amalgamation, they will
      still need to be configured, built and installed explicitly, and
      Subversion's own configure script may need to be told where to find
      them, if they were not installed in standard system locations.

      Note: there are optional dependencies (such as openssl, swig, and httpd)
      which get-deps.sh does not download.

      Note: Because previous builds of Subversion may have installed older
      versions of these libraries, you may want to run some of the cleanup
      commands described in section II.B before installing the following.


      1.  Apache Portable Runtime 1.3 or newer  (REQUIRED)

      Whenever you want to build any part of Subversion, you need the
      Apache Portable Runtime (APR) and the APR Utility (APR-util)
      libraries.

      If you do not have a pre-installed APR and APR-util, you will need
      to get these yourself:

          http://apr.apache.org/download.cgi

      On Unix systems, if you already have the APR libraries compiled and do
      not wish to regenerate them from source code, then Subversion needs to
      be able to find them.

      There are a couple of options to "./configure" that tell it where
      to look for the APR and APR-util libraries. By default it will try
      to locate the libraries using apr-config and apu-config scripts.
      These scripts provide all the relevant information for the APR and
      APR-util installations.

      If you want to specify the location of the APR library, you can use
      the "--with-apr=" option of "./configure". It should be able to find
      the apr-config script in the standard location under that directory
      (e.g. ${prefix}/bin).

      Similarly, you can specify the location of APR-util using the
      "--with-apr-util=" option to "./configure". It will look for the
      apu-config script relative to that directory.

      For example, if you want to use the APR libraries you built
      with the Apache httpd server, you could run:

          $ ./configure --with-apr=/usr/local/apache2 \
            --with-apr-util=/usr/local/apache2  ...

      Be sure to use a native Windows SVN client (as opposed to
      Cygwin's version) so that the .dsp files get carriage-returns at
      the ends of their lines.  Otherwise Visual Studio will complain
      that it doesn't recognize the .dsp files.

      If you use APR libraries checked out from svn in an Unix
      environment, you need to run the 'buildconf' script in each
      library's directory, to regenerate the configure scripts and
      other files required for compiling the libraries:

      $ cd apr; ./buildconf; ./configure ...; make; make install; cd ..

      $ cd apr-util; ./buildconf; ./configure ...; make; make install; cd ..

      Configure build and install both libraries before running Subversion's
      configure script.


      2. Zlib  (REQUIRED)

         Subversion's binary-differencing engine depends on zlib for
         compression.   Most Unix systems have libz pre-installed, but
         if you need it, you can get it from

            http://www.zlib.net/


      3.  autoconf 2.59 or newer (Unix only)

      This is required only if you plan to build from the latest source
      (see section II.B). Generally only developers would be doing this.


      4.  libtool 1.4 or newer (Unix only)

      This is required only if you plan to build from the latest source
      (see section II.B).

      Note: Some systems (Solaris, for example) require libtool 1.4.3 or
      newer. The autogen.sh script knows about that.


      5.  Serf library 1.3.4 or newer (OPTIONAL)

      If you want your client to be able to speak to an Apache
      server (via a http:// or https:// URL), you must link against
      serf.  Though optional, we strongly recommend this.

      In order to use ra_serf, you must install serf, and run Subversion's
      ./configure with the argument --with-serf.  If serf is installed in a
      non-standard place, you should use

               --with-serf=/path/to/serf/install

      instead.

      Serf can be obtained via your system's package distribution
      system or directly from http://code.google.com/p/serf/.

      For more information on serf and Subversion's ra_serf, see the file
      subversion/libsvn_ra_serf/README.

      6. OpenSSL  (OPTIONAL)

      ### needs some updates. I think serf automagically handles
      ### finding OpenSSL, but we may need more docco here. and w.r.t
      ### zlib.

      The Serf library has support for SSL encryption by relying on the
      OpenSSL library.

        a. Using OpenSSL on the client through Serf

          On Unix systems, to build Serf with OpenSSL, you need OpenSSL
          installed on your system, and you must add "--with-ssl" as a
          "./configure" parameter.  If your OpenSSL installation is hard
          for Serf to find, you may need to use "--with-libs=/path/to/lib"
          in addition.  In particular, on Red Hat (but not Fedora Core) it
          is necessary to specify "--with-libs=/usr/kerberos" for OpenSSL
          to be found.  You can also specify a path to the zlib library
          using "--with-libs".

          Under Windows, you can specify the paths to these libraries by
          passing the options --with-zlib and --with-openssl to gen-make.py.

        b. Using OpenSSL on the Apache server

          You can also add support for these features to an Apache httpd
          server to be used for Subversion using the same support libraries.
          The Subversion build system will not provide them, however.  You
          add them by specifying parameters to the "./configure" script of
          the Apache Server instead.

          For getting SSL on your server, you would add the "--enable-ssl"
          or "--with-ssl=/path/to/lib" option to Apache's "./configure"
          script.  Apache enables zlib support by default, but you can
          specify a nonstandard location for the library with the
          "--with-z=/path/to/dir" option.  Consult the Apache documentation
          for more details, and for other modules you may wish to install
          to enhance your Subversion server.

      If you don't already have it, you can get a copy of OpenSSL,
      including instructions for building and packaging on both Unix
      systems and Windows, at:

          http://www.openssl.org/


      7.  Berkeley DB 4.X  (OPTIONAL)

      Berkeley DB is needed to build a Subversion server that supports
      the BDB repository filesystem, or to access a BDB repository on
      local disk.  If you will only use the FSFS repository filesystem,
      or if you are building a Subversion client that will only speak
      to remote (networked) repositories, you don't need it.

      The current recommended version is 4.4.20 or newer, which brings
      auto-recovery functionality to the Berkeley DB database
      environment.

      If you must use an older version of Berkeley DB, we *strongly*
      recommend using 4.3 or 4.2 over the 4.1 or 4.0 versions.  Not
      only are these significantly faster and more stable, but they
      also enable Subversion repositories to automatically clean up
      database journal files to save disk space.

      You'll need Berkeley DB installed on your system.  You can
      get it from:

      http://www.oracle.com/technology/software/products/berkeley-db/index.html

      If you have Berkeley DB installed in a place not searched by default
      for includes and libraries, add something like this:

          --with-berkeley-db=db.h:/usr/local/include/db4.7:/usr/local/lib/db4.7:db-4.7

      to your `configure' switches, and the build process will use the
      Berkeley DB header and library in the named directories.  You may
      need to use a different path, of course.  Note that in order for
      the detection to succeed, the dynamic linker must be able to find
      the libraries at configure time.

      If you are on the Windows platform and want to build Subversion,
      a precompiled version of the Berkeley DB library is available for
      download at the Subversion web site "Documents & files" area:

          http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=688

      Look in the "Releases > Windows > Windows BDB" section.


      8.  Cyrus SASL library (OPTIONAL)

      If the Simple Authentication and Security Layer (SASL) library
      is detected on your system, then the Subversion client and
      svnserve server can utilize its abilities for various forms of
      authentication.  To learn more about SASL or to get the source
      code, visit:

         http://freshmeat.net/projects/cyrussasl/


      9.  Apache Web Server 2.2.X or newer  (OPTIONAL)

          (http://httpd.apache.org/download.cgi)

      The Apache httpd server is one of two methods to make your Subversion
      repository available over a network - the other is a custom server
      program called svnserve, which requires no extra software packages.
      Building Subversion, the Apache server, and the modules that Apache
      needs to communicate with Subversion are complicated enough that there
      is a whole section at the end of this document that describes how it
      is done: See section III for details.


      10.  Python 2.7 or newer (http://www.python.org/)  (OPTIONAL)

      If you want to run "make check" or build from the latest source
      under Unix/Windows as described in section II.B, II.E and III.D,
      install Python 2.7 or higher on your system. The majority of the
      test suite is written in Python, as is part of Subversion's build
      system.

      Note that Python 3.x is not supported and most likely won't work.


      11. Perl 5.8 or newer (Windows only)  (OPTIONAL)

      To build Subversion under any of the MS Windows platforms, you
      will also need Perl 5.8 or newer to run apr-util's w32locatedb.pl
      script.


      12. SQLite  (REQUIRED)

      Subversion requires SQLite version 3.7.12 or above.  You can meet this
      dependency several ways:
        * Use an SQLite amalgamation file.
        * Specify an SQLite installation to use.
        * Let Subversion find an installed SQLite.

      To use an SQLite-provided amalgamation, just drop sqlite3.c into
      Subversion's sqlite-amalgamation/ directory, or point to it with the
      --with-sqlite configure option.  This file also ships with the Subversion
      dependencies distribution, or you can download it from SQLite:

          http://www.sqlite.org/download.html


      13. pkg-config  (Unix only, OPTIONAL)

      Subversion uses pkg-config to find appropriate options used
      at build time.


      14. D-Bus  (Unix only, OPTIONAL)

      D-Bus is a message bus system. D-Bus is required for support for KWallet
      and GNOME Keyring. pkg-config is needed to find D-Bus headers and library.


      15. Qt 4  (Unix only, OPTIONAL)

      Qt is a cross-platform application framework. QtCore, QtDBus and QtGui
      modules are required for support for KWallet. pkg-config is needed
      to find Qt headers and libraries.


      16. KDELibs 4  (Unix only, OPTIONAL)

      Subversion contains optional support for storing passwords in KWallet.
      KDELibs contains core KDE libraries. Subversion uses libkdecore and libkdeui
      libraries when support for KWallet is enabled. kde4-config is used to get
      some necessary options. pkg-config, D-Bus and Qt 4 are also required.
      If you want to build support for KWallet, then pass the '--with-kwallet'
      option to `configure`. If KDE is installed in a non-standard prefix, then
      use:

          --with-kwallet=/path/to/KDE/prefix

      17. GLib 2  (Unix only, OPTIONAL)

      GLib is a general-purpose utility library. GLib is required for support
      for GNOME Keyring. pkg-config is needed to find GLib headers and library.


      18. GNOME Keyring  (Unix only, OPTIONAL)

      Subversion contains optional support for storing passwords in GNOME Keyring.
      pkg-config is needed to find GNOME Keyring headers and library. D-Bus and
      GLib are also required. If you want to build support for GNOME Keyring,
      then pass the '--with-gnome-keyring' option to `configure`.


      19. Ctypesgen  (OPTIONAL)

      Ctypesgen is Python wrapper generator for ctypes. It is used to generate
      a part of Subversion Ctypes Python bindings (CSVN). If you want to build
      CSVN, then pass the '--with-ctypesgen' option to `configure`. If ctypesgen.py
      is installed in a non-standard place, then use:

          --with-ctypesgen=/path/to/ctypesgen.py

      For more information on CSVN, see subversion/bindings/ctypes-python/README.

      20. libmagic (OPTIONAL)

      Subversion's configure script attempts to find libmagic automatically.
      If it is installed in a non-standard location, then use:

        --with-libmagic=/path/to/libmagic/prefix

      The files include/magic.h and lib/libmagic.so.1.0 (or similar)
      are expected beneath this prefix directory. If they cannot be
      found Subversion will be compiled without support for libmagic.

      If libmagic is installed but support for it should not be compiled
      in, then use:
      
        --with-libmagic=no

      If configure should fail when libmagic is not present, but only
      the default locations should be searched, then use:

        --with-libmagic

      21. Googlemock (OPTIONAL)

      Googlemock can be installed and built in-tree by invoking

      $ ./get-dep.sh gmock

  D. Documentation

      The primary documentation for Subversion is the free book
      "Version Control with Subversion", a.k.a. "The Subversion Book",
      obtainable from http://svnbook.red-bean.com/.

      Various additional documentation exists in the doc/ subdirectory of
      the Subversion source.  See the file doc/README for more information.



II.   INSTALLATION
      ============

  A.  Building from a Tarball
      ------------------------------

      1.  Building from a Tarball

      Download the most recent distribution tarball from:

          http://subversion.apache.org/download/

      Unpack it, and use the standard GNU procedure to compile:

          $ ./configure
          $ make
          # make install

      You can also run the full test suite by running 'make check'.  Even
      in successful runs, some tests will report XFAIL; that is normal.
      Failed runs are indicated by FAIL or XPASS results, or a non-zero exit
      code from "make check".


  B.  Building the Latest Source under Unix
      -------------------------------------

      These instructions assume you have already installed Subversion
      and checked out a working copy of Subversion's own code --
      either the latest /trunk code, or some branch or tag.  You also
      need to have already installed whatever prerequisites that
      version of Subversion requires (if you haven't, the ./configure
      step should complain).

      You can discard the directory created by the tarball; you're
      about to build the latest, greatest Subversion client.  This is
      the procedure Subversion developers use.

      First off, if you have any Subversion libraries lying around
      from previous 'make installs', clean them up first!

          # rm -f /usr/local/lib/libsvn*
          # rm -f /usr/local/lib/libapr*
          # rm -f /usr/local/lib/libserf*

      Start the process by running "autogen.sh":

          $ sh ./autogen.sh

      This script will make sure you have all the necessary components
      available to build Subversion.  If any are missing, you will be
      told where to get them from.  (See the 'Dependency Overview' in
      section I.)

      Note: if the command "autoconf" on your machine does not run
      autoconf 2.59 or later, but you do have a new enough autoconf
      available, then you can specify the correct one with the
      AUTOCONF variable.  (The AUTOHEADER variable is similar.)  This
      may be required on Debian GNU/Linux, where "autoconf" is
      actually a Perl script that attempts to guess which version is
      required -- because of the interaction between Subversion's and
      APR's configuration systems, the Perl script may get it wrong.
      So for example, you might need to do:

          $ AUTOCONF=autoconf2.59 sh ./autogen.sh

      Once you've prepared the working copy by running autogen.sh,
      just follow the usual configuration and build procedure:

          $ ./configure
          $ make
          # make install

      (Optionally, you might want to pass --enable-maintainer-mode to
      the ./configure script.  This enables debugging symbols in your
      binaries (among other things) and most Subversion developers use it.)

      Since the resulting binary depends on shared libraries, the
      destination library directory must be identified in your
      operating system's library search path. That is in either
      /etc/ld.so.conf or $LD_LIBRARY_PATH for Linux systems and in
      /etc/rc.conf for FreeBSD, followed by a run of the 'ldconfig'
      program. Check your system documentation for details. By
      identifying the destination directory, Subversion will be able
      to dynamically load repository access plugins.  If you try to do
      a checkout and see an error like:

      subversion/libsvn_ra/ra_loader.c:209: (apr_err=170000)
      svn: Unrecognized URL scheme 'https://svn.apache.org/repos/asf/subversion/trunk'

      It probably means that the dynamic loader/linker can't find all
      of the libsvn_* libraries.


  C.  Building under Unix in Different Directories
      --------------------------------------------

      It is possible to configure and build Subversion on Unix in a
      directory other than the working copy. For example

          $ svn co https://svn.apache.org/repos/asf/subversion/trunk svn
          $ cd svn
          $ # get SQLite amalgamation if required
          $ chmod +x autogen.sh
          $ ./autogen.sh
          $ mkdir ../obj
          $ cd ../obj
          $ ../svn/configure [...with options as appropriate...]
          $ make

      puts the Subversion working copy in the directory svn and builds
      it in a separate, parallel directory obj.

      Why would you want to do this? Well there are a number of
      reasons...

          *  You may prefer to avoid "polluting" the working copy with
             files generated during the build.

          *  You may want to put the build directory and the working
             copy on different physical disks to improve performance.

          *  You may want to separate source and object code and only
             backup the source.

          *  You may want to remote mount the working copy on multiple
             machines, and build for different machines from the same
             working copy.

          *  You may want to build multiple configurations from the
             same working copy.

      The last reason above is possibly the most useful.  For instance
      you can have separate debug and optimized builds each using the
      same working copy. Or you may want a client-only build and a
      client-server build. Using multiple build directories you can
      rebuild any or all configurations after an edit without the need
      to either clean and reconfigure, or identify and copy changes
      into another working copy.


  D.  Installing from a Zip or Installer File under Windows
      --------------------------------------------------------

      Of all the ways of getting a Subversion client, this is the
      easiest.  Download a Zip (*.zip) or self-extracting installer
      (*-setup.exe) file from:

      http://subversion.apache.org/packages#windows

      For a Zip file, run your unzipping utility (WinZIP, ZipGenius,
      UltimateZIP, FreeZIP, whatever) and extract the DLLs and EXEs to
      a directory of your choice. Included in the download is the SVN
      client, the SVNADMIN administration tool, and the SVNLOOK
      reporting tool.

      Note that if you need support for non-English locales you'll have
      to set the APR_ICONV_PATH environment variable to the path of the
      iconv directory in the folder that contains the Subversion install.

      You may also want to add the bin directory in the Subversion folder
      to your PATH environment variable so as to not have to use the full
      path when running Subversion commands.

      To test the installation, open a DOS box (run either "cmd" or
      "command" from the Start menu's "Run..." menu option), change to
      the directory you installed the executables into, and run:

          C:\test>svn co https://svn.apache.org/repos/asf/subversion/trunk svn

      This will get the latest Subversion sources and put them into the
      "svn" subdirectory.

      If using a self-extracting .exe file, just run it instead of
      unzipping it, to install Subversion.

  E.  Building the Latest Source under Windows
      ----------------------------------------

  E.1 Prerequisites

      * Visual Studio 6 and service pack. It can be built with later versions
        of Visual Studio (Visual Studio.NET 2005-2015, Visual C++ Express
        2005-2010, Visual Studio Express 2012-2013 and Visual Studio Community
        2013-2015) but these instructions assume VS6.
      * A recent Windows SDK. (Not needed with Visual Studio 2005 and later)
        If you are using Visual Studio 6, you need the latest SDK which
        is compatible with VC6, which is the one from February 2003.
        You can get it from MSDN:
        https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/e1147034-9b0b-4494-a5bc-6dfebb6b7eb1/download-and-install-microsoft-platform-sdk-febuary-2003-last-version-with-vc6-support?forum=windowssdk
      * Python 2.7 or higher, downloaded from http://www.python.org/ which is
        used to generate the project files.
        Note that Python 3.x is not supported (yet).
      * Perl 5.8 or higher from http://www.activestate.com/
      * Awk (from http://www.cs.princeton.edu/~bwk/btl.mirror/awk95.exe) is
        needed to compile Apache or APR.  Note that this is the actual awk
        program, not an installer - just rename it to awk.exe and it is
        ready to use.
      * Apache apr, apr-util, and optionally apr-iconv libraries, version
        1.3 or later. Included in both the Subversion dependencies ZIP file
        and the Apache 2 source zip.  If you are building from a Subversion
        checkout and have not downloaded Apache 2, then get these 3 libraries
        from http://www.apache.org/dist/apr/.
      * SQLite 3.7.12 or higher from http://www.sqlite.org/download.html
      * ZLib 1.2 or higher is required and is included in the Subversion
        dependencies zip file or can be obtained from http://www.zlib.net/
      * Either a Subversion client binary from http://subversion.apache.org/ to
        do the initial checkout of the Subversion source or the zip file
        source distribution. See the section "Bootstrapping from a Zip or
        Installer File under Windows" above for more.
      * A means of unpacking the files, e.g., WinZIP or similar.

      Additional Options

      * [Optional] Apache 2 source, downloaded from
        http://httpd.apache.org/download.cgi, these instructions assume
        version 2.0.58.  This is only needed for building the Subversion
        server Apache modules.  ### FIXME Apache 2.2 or greater required.
      * [Optional] Apache 2 msi install file, also from
        http://httpd.apache.org/download.cgi (required for running the
        tests).  Only needed for testing the server dso modules and if
        you are using Visual Studio 6.
        Note that if you are not using Visual Studio 6 (and you want to
        run and test the server modules) then you must rebuild Apache
        from source -- do not use the stock MSI since mixing C runtime
        libraries is not supported.
      * [Optional] Berkeley DB for backend support of the server
        components -- versions 4.3.27 and 4.4.20 are available from
        http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=688
        as db-4.3.27-win32.zip and db-4.4.20-win32.zip.
        For more information see Section I.C.7.
      * [Optional] Openssl 0.9.7f or higher can be obtained from
        http://www.openssl.org/source/openssl-0.9.7f.tar.gz
      * [Optional] A modified version of GNU libintl, called
        svn-win32-libintl.zip, can be used for displaying localized
        messages. Available at:
        http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=2627
      * [Optional] GNU gettext for generating message catalog (.mo)
        files from message translations. You can get the latest
        binaries from http://gnuwin32.sourceforge.net/. You'll need the
        binaries (gettext-0.14.1-bin.zip) and dependencies
        (gettext-0.14.1-dep.zip).
      * [Optional] An assembler, e.g., MASM32 from http://www.masm32.com/
        or nasm which is available from
        http://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D

  E.2 Notes

      The Serf library supports secure connections with OpenSSL and
      on-the-wire compression with zlib. If you want to use the
      secure connections feature, you should pass the option
      "--with-openssl" to the gen-make.py script. See Section I.C.6 for
      more details.

  E.3 Preparation

      This section describes how to unpack the files to make a build tree.

      * Make a directory SVN and cd into it.
      * Either checkout Subversion:

          svn co https://svn.apache.org/repos/asf/subversion/trunk src-trunk

        or unpack the zip file distribution and rename the directory to
        src-trunk.

      * Install Visual Studio Environment. You either have to tell the
        installer to register environment variables or run VCVARS32.BAT
        before building anything.  If you are using a newer Visual Studio,
        use the 'Visual Studio 20xx Command Prompt' on the Start menu.
      * Install and register a recent Windows Core SDK if you are using
        Visual Studio 6. This is a quote from the Microsoft February 2003
        SDK documentation:

       "To register the SDK bin, include, and library directories with
        Microsoft Visual Studio® version 6.0 and Visual Studio .NET,
        click Start, point to All Programs, point to Microsoft Platform
        SDK February 2003, point to Visual Studio Registration, and then
        click Register PSDK Directories with Visual Studio. This
        registration process places the SDK bin, include, and library
        directories at the beginning of the search paths, which ensures
        that the latest headers and libraries are used when building
        applications in the IDE. Note that for Visual Studio 6.0
        integration to succeed, Visual Studio 6.0 must run at least once
        before you select Register PSDK Directories with Visual
        Studio. Also note that when this option is run, the IDEs should
        not be running."

      * Install Python and add it to your path
      * Install Perl (it should add itself to the path)
      * Copy AWK (awk95.exe) to awk.exe (e.g. SVN\awk\awk.exe) and add
        the directory containing it (e.g. SVN\awk) to the path.
      * [Optional] Install Apache 2 using the msi file if you are going to test
        the server dso modules and are using Visual Studio 6.  You must build
        and install it from source if you are not using Visual Studio 6 and
        want to build and/or test the server modules.
      * [Optional] If you checked out Subversion from the repository and want
        to build Subversion with http/https access support then install the
        serf sources into SVN\src-trunk\serf.
      * [Optional] If you want BDB backend support, extract the Berkeley DB
        files into SVN\src-trunk\db4-win32. It's a good idea to add
        SVN\src-trunk\db4-win32\bin to your PATH, so that Subversion can find
        the Berkeley DB DLLs.

        [NOTE: This binary package of Berkeley DB is provided for
            convenience only. Please don't address questions about
            Berkeley DB that aren't directly related to using Subversion
            to the project mailing list.]

        If you build Berkeley DB from the source, you will have to copy
        the file db-x.x.x\build_win32\db.h to
        SVN\src-trunk\db4-win32\include, and all the import libraries to
        SVN\src-trunk\db4-win32\lib. Again, the DLLs should be somewhere in
        your path.

      * [Optional] If you want to build the server modules, extract Apache
        source into SVN\httpd-2.x.x.
      * If you are building from a checkout of Subversion, and you are NOT
        building Apache, then you will need the APR libraries.  Depending
        on how you got your version of APR, either:
          - Extract the APR, APR-util and APR-iconv source distributions into
            SVN\apr, SVN\apr-util, and SVN\apr-iconv respectively.
        Or:
          - Extract the apr, apr-util and apr-iconv directories from the
            srclib folder in the Apache httpd source into SVN\apr,
            SVN\apr-util, and SVN\apr-iconv respectively.
      * Extract the ZLib sources into SVN\zlib if you are not using the zlib
        included in the dependencies zip file.
      * [Optional] If you want secure connection (https) client support, or if
        you are building with enabled support for serf extract openssl into
        SVN\openssl-x.x.x
      * [Optional] If you want localized message support, extract
        svn-win32-libintl.zip into SVN\svn-win32-libintl and extract
        gettext-x.x.x-bin.zip and gettext-x.x.x-dep.zip into
        SVN\gettext-x.x.x-bin.
        Add SVN\gettext-x.x.x-bin\bin to your path.
      * [Optional] Extract MASM32 (only the ML.EXE and ML.ERR files) into
        SVN\asm (or extract nasm into SVN\asm) and put it in your path.
      * Download the SQLite amalgemation from
        http://www.sqlite.org/download.html
        and extract it into SVN\sqlite-amalgemation.
        See I.C.12 for alternatives to using the amalgemation package.

  E.4 Building the Binaries

      To build the binaries either follow the instructions here or use
      build\win32\vc6-build.bat.in after editing its default paths to match
      yours and saving it as vc6-build.bat.  The vc6-build.bat does a full build
      using all options so it requires Apache 2 source and the other optional
      components.

      Start in the SVN directory you created.

      Set up the environment (commands should be one line even if wrapped here).

      C:>set VER=trunk
      C:>set DIR=trunk
      C:>set BUILD_ROOT=C:\SVN
      C:>set PYTHONDIR=C:\Python22
      C:>set AWKDIR=C:\SVN\Awk
      C:>set ASMDIR=C:\SVN\asm
      C:>set SDKINC="C:\Program Files\Microsoft SDK\include"
      C:>set SDKLIB="C:\Program Files\Microsoft SDK\lib"
      C:>set GETTEXTBIN=C:\SVN\gettext-0.14.1-bin\bin
      C:>PATH=%PATH%;%BUILD_ROOT%\src-%DIR%\db4-win32;%ASMDIR%;
              %PYTHONDIR%;%AWKDIR%;%GETTEXTBIN%
      C:>set INCLUDE=%SDKINC%;%INCLUDE%
      C:>set LIB=%SDKLIB%;%LIB%

      OpenSSL

      C:>cd openssl-0.9.7f
      C:>perl Configure VC-WIN32
  [*] C:>call ms\do_masm
      C:>nmake -f ms\ntdll.mak
      C:>cd out32dll
      C:>call ..\ms\test
      C:>cd ..\..

      *Note: Use "call ms\do_nasm" if you have nasm instead of MASM, or
             "call ms\do_ms" if you don't have an assembler.

      Apache 2

      This step is only required for building the server dso modules.

      C:>set APACHEDIR=C:\Program Files\Apache Group\Apache2
      C:>msdev httpd-2.0.58\apache.dsw /MAKE "BuildBin - Win32 Release"

      APR

      If you downloaded APR / APR-UTIL / APR_ICONV by source, you will have to
      build these libraries first.
      Building these libraries on Windows is straight forward and in most cases
      as simple as issuing these two commands:

      C:>nmake -f Makefile.win
      C:>nmake -f Makefile.win install

      Please refere to the build instructions provided by the library source
      for actual build instructions.

      ZLib

      If you downloaded the zlib source, you will have to build ZLib first.
      Building ZLib using Visual Studio should be quite simple. Just open the
      appropriate solution and build the project zlibstat using the IDE.

      Please refere to the build instructions provided by the library source
      for actual build instructions.

      Note that you'd make sure to define ZLIB_WINAPI in the ZLib config
      header and move the lib-file into the zlib root-directory.

      Serf

      ### Section about serf might be required/useful to add.
      ### scons is required too and serf needs to be configured prior to be
      ### able to build Subversion using:
      ### scons APR=[PATH_TO_APR] APU=[PATH_TO_APU] OPENSSL=[PATH_TO_OPENSSL]
      ### ZLIB=[PATH_TO_ZLIB] PREFIX=[PATH_TO_SERF_DEST]
      ### scons check
      ### scons install

      Subversion

      Things to note:

      * If you don't want to build mod_dav_svn, omit the --with-httpd
        option.  The zip file source distribution contains apr, apr-util and
        apr-iconv in the default build location. If you have downloaded the
        apr files yourself you will have to tell the generator where to find
        the APR libraries; the options are --with-apr, --with-apr-util and
        --with-apr-iconv.
      * If you would like a debug build substitute Debug for Release in
        the msdev/msbuild commands.
      * There have been rumors that Subversion on Win32 can be built
        using the latest cygwin, you probably don't want the zip file source
        distribution though. ymmv.
      * The /USEENV switch to msdev makes it take notice of the INCLUDE and
        LIB environment variables, it also makes it ignore its own lib and
        include settings so you need to have the Windows SDK lib and include
        directories in the LIB and INCLUDE environment variables.  Do *not*
        use this switch when starting up the msdev Visual environment.  If you
        wish to build in the Visual environment the SDK lib and include
        directories must be in the Tools/Options/Directories settings (if you
        followed the 'Register the SDK with Visual Studio 6' instructions
        above this has been done for you).
      * If you are using Visual Studio later than VC6 change -t dsw into
        -t vcproj and add the --vsnet-version=20xx option on the gen-make.py
        command.
        In this case you will also have to distribute the C runtime dll with
        the binaries.  Also, since Apache/APR do not provide .vcproj files,
        you will need to convert the Apache/APR .dsp files to .vcproj files
        with Visual Studio before building -- just open the Apache .dsw file
        and answer 'Yes To All' when the conversion dialog pops up, or you
        can open the individual .dsp files and convert them one at a time.
        The Apache/APR projects required by Subversion are:
        apr-util\libaprutil.dsp, apr\libapr.dsp,
        apr-iconv\libapriconv.dsp, apr-util\xml\expat\lib\xml.dsp,
        apr-iconv\ccs\libapriconv_ccs_modules.dsp, and
        apr-iconv\ces\libapriconv_ces_modules.dsp.
      * If the server dso modules are being built and tested Apache must not
        be running or the copy of the dso modules will fail.

      C:>cd src-%DIR%

      If Apache 2 has been built and the server modules are required then
      gen-make.py will already have been run. If the source is from the zip
      file, Apache 2 has not been built so gen-make.py must be run:

      C:>python gen-make.py -t dsp --with-berkeley-db=db4-win32
          --with-openssl=..\openssl-0.9.7f --with-zlib=..\zlib
          --with-libintl=..\svn-win32-libintl

      Then build subversion:

      C:>msdev subversion_msvc.dsw /USEENV /MAKE "__ALL_TESTS__ - Win32 Release"
      C:>cd ..

      Or, with Visual C++.NET 2005 or C++ Express 2005:

      C:>devenv subversion_vcnet.sln /build "Release" /project "__ALL_TESTS__"
      C:>cd ..

      Or, with Visual C++.NET 2008+, C++ Express 2008+, Studio Express 2012+ or
      Studio Community 2013+:

      C:>msbuild subversion_vcnet.sln /t:__ALL_TESTS__ /p:Configuration=Release
      C:>cd ..

      The binaries have now been built.

  E.5 Packaging the binaries

      You now need to copy the binaries ready to make the release zip
      file. You also need to do this to run the tests as the new binaries
      need to be in your path. You can use the build/win32/make_dist.py
      script in the Subversion source directory to do that.

      [TBD: Describe how to do this. Note dependencies on zip, jar, doxygen.]

  E.6 Testing the Binaries
      [TBD: It's been a long, long while since it was necessary to move
            binaries around for testing. win-tests.py does that automagically.
            Fix this section accordingly, and probably reorder, putting
            the packaging at the end.]

      The build process creates the binary test programs but it does not
      copy the client tests into the release test area.

      C:>cd src-%DIR%
      C:>mkdir Release\subversion\tests\cmdline
      C:>xcopy /S /Y subversion\tests\cmdline Release\subversion\tests\cmdline

      If the server dso modules  have been built then copy the dso files and
      dlls into the Apache modules directory.

      C:>copy Release\subversion\mod_dav_svn\mod_dav_svn.so "%APACHEDIR%"\modules
      C:>copy Release\subversion\mod_authz_svn\mod_authz_svn.so
         "%APACHEDIR%"\modules
      C:>copy svn-win32-%VER%\bin\intl.dll "%APACHEDIR%\bin"
      C:>copy svn-win32-%VER%\bin\iconv.dll "%APACHEDIR%\bin"
      C:>copy svn-win32-%VER%\bin\libdb42.dll "%APACHEDIR%\bin"
      C:>cd ..

      Put the svn-win32-trunk\bin directory at the start of your path so
      you run the newly built binaries and not another version you might
      have installed.

      Then run the client tests:

      C:>PATH=%BUILD_ROOT%\svn-win32-%VER%\bin;%PATH%
      C:>cd src-%DIR%
      C:>python win-tests.py -c -r -v

      If the server dso modules were built configure Apache to use the
      mod_dav_svn and mod_authz_svn modules by making sure these lines appear
      uncommented in httpd.conf:

        LoadModule dav_module         modules/mod_dav.so
        LoadModule dav_fs_module      modules/mod_dav_fs.so
        LoadModule dav_svn_module     modules/mod_dav_svn.so
        LoadModule authz_svn_module   modules/mod_authz_svn.so

      And further down the file add location directives to point to the
      test repositories. Change the paths to the SVN directory you created
      (paths should be on one line even if wrapped here):

        <Location /svn-test-work/repositories>
         DAV svn
         SVNParentPath C:/SVN/src-trunk/Release/subversion/tests/cmdline/
                       svn-test-work/repositories
        </Location>

        <Location /svn-test-work/local_tmp/repos>
         DAV svn
         SVNPath c:/SVN/src-trunk/Release/subversion/tests/cmdline/
                 svn-test-work/local_tmp/repos
        </Location>

      Then restart Apache and run the tests:

      C:>python win-tests.py -c -r -v -u http://localhost
      C:>cd ..

III.  BUILDING A SUBVERSION SERVER
      ============================

      Subversion has two servers you can choose from:  svnserve and
      Apache.  svnserve is a small, lightweight server program that is
      automatically compiled when you build Subversion's source.  Apache
      is a more heavyweight HTTP server, but tends to have more features.

      This section primarily focuses on how to build Apache and the
      accompanying mod_dav_svn server module for it.  If you plan to use
      svnserve instead, jump right to section E for a quick explanation.


  A.  Setting Up Apache
      -----------------

      1.  Obtaining and Installing Apache 2

      Subversion tries to compile against the latest released version
      of Apache httpd 2.2+.  The easiest thing for you to do is download
      a source tarball of the latest release and unpack that.

      If you have questions about the Apache httpd 2.2 build, please consult
      the httpd install documentation:

          http://httpd.apache.org/docs-2.2/install.html

      At the top of the httpd tree:

          $ ./buildconf
          $ ./configure --enable-dav --enable-so --enable-maintainer-mode

      The first arg says to build mod_dav.

      The second arg says to enable shared module support which is needed
      for a typical compile of mod_dav_svn (see below).

      The third arg says to include debugging information.  If you
      built Subversion with --enable-maintainer-mode, then you should
      do the same for Apache; there can be problems if one was
      compiled with debugging and the other without.

      Note: if you have multiple db versions installed on your system,
      Apache might link to a different one than Subversion, causing
      failures when accessing the repository through Apache.  To prevent
      this from happening, you have to tell Apache which db version to
      use and where to find db.  Add --with-dbm=db4 and
      --with-berkeley-db=/usr/local/BerkeleyDB.4.2 to the configure
      line.  Make sure this is the same db as the one Subversion uses.
      This note assumes you have installed Berkeley DB 4.2.52
      at its default locations.  For more info about the db requirement,
      see section I.C.7.

      You may also want to include other modules in your build. Add
      --enable-ssl to turn on SSL support, and --enable-deflate to turn on
      compression support, for example.  Consult the Apache documentation
      for more details.

      All instructions below assume you configured Apache to install
      in its default location, /usr/local/apache2/; substitute
      appropriately if you chose some other location.

      Compile and install apache:

          $ make && make install


  B.  Making and Installing the Subversion Apache Server Module
      ---------------------------------------------------------

      Go back into your subversion working copy and run ./autogen.sh if
      you need to.  Then, assuming Apache httpd 2.2 is installed in the
      standard location, run:

          $ ./configure

      Note: do *not* configure subversion with "--disable-shared"!
      mod_dav_svn *must* be built as a shared library, and it will
      look for other libsvn_*.so libraries on your system.

      If you see a warning message that the build of mod_dav_svn is
      being skipped, this may be because you have Apache httpd 2.x
      installed in a non-standard location.  You can use the
      "--with-apxs=" option to locate the apxs script:

          $ ./configure --with-apxs=/usr/local/apache2/bin/apxs

      Note: it *is* possible to build mod_dav_svn as a static library
      and link it directly into Apache. Possible, but painful. Stick
      with the shared library for now; if you can't, then ask.

          $ rm /usr/local/lib/libsvn*

      If you have old subversion libraries sitting on your system,
      libtool will link them instead of the `fresh' ones in your tree.
      Remove them before building subversion.

          $ make clean && make && make install

      After the make install, the Subversion shared libraries are in
      /usr/local/lib/.  mod_dav_svn.so should be installed in
      /usr/local/libexec/ (or elsewhere, such as /usr/local/apache2/modules/,
      if you passed --with-apache-libexecdir to configure).


      Section II.E explains how to build the server on Windows.


  C.  Configuring Apache for Subversion
      ---------------------------------

      The following section is an abbreviated version of the
      information in the Subversion Book
      (http://svnbook.red-bean.com).  Please read chapter 6 for more
      details.

      The following assumes you have already created a repository.
      For documentation on how to do that, see README.

      The following also assumes that you have modified
      /usr/local/apache2/conf/httpd.conf to reflect your setup.
      At a minimum you should look at the User, Group and ServerName
      directives.  Full details on setting up apache can be found at:
      http://httpd.apache.org/docs-2.2/

      First, your httpd.conf needs to load the mod_dav_svn module.
      If you pass --enable-mod-activation to Subversion's configure,
      'make install' target should automatically add this line for you.
      In any case, if Apache HTTPD gives you an error like "Unknown
      DAV provider: svn", then you may want to verify that this line
      exists in your httpd.conf:

         LoadModule dav_svn_module     modules/mod_dav_svn.so

      NOTE: if you built mod_dav as a dynamic module as well, make sure
      the above line appears after the one that loads mod_dav.so.

      Next, add this to the *bottom* of your httpd.conf:

      <Location /svn/repos>
          DAV svn
          SVNPath /absolute/path/to/repository
      </Location>

      This will give anyone unrestricted access to the repository.  If
      you want limited access, read or write, you add these lines to
      the Location block:

          AuthType Basic
          AuthName "Subversion repository"
          AuthUserFile /my/svn/user/passwd/file

      And:

          a) For a read/write restricted repository:

             Require valid-user

          b) For a write restricted repository:

             <LimitExcept GET PROPFIND OPTIONS REPORT>
                 Require valid-user
             </LimitExcept>

          c) For separate restricted read and write access:

             AuthGroupFile /my/svn/group/file

             <LimitExcept GET PROPFIND OPTIONS REPORT>
                 Require group svn_committers
             </LimitExcept>

             <Limit GET PROPFIND OPTIONS REPORT>
                 Require group svn_committers
                 Require group svn_readers
             </Limit>

      ### FIXME Tutorials section refers to old 2.0 docs
      These are only a few simple examples.  For a complete tutorial
      on Apache access control, please consider taking a look at the
      tutorials found under "Security" on the following page:
      http://httpd.apache.org/docs-2.0/misc/tutorials.html

      In order for 'svn cp' to work (which is actually implemented as a
      DAV COPY command), mod_dav needs to be able to determine the
      hostname of the server.  A standard way of doing this is to use
      Apache's ServerName directive to set the server's hostname.  Edit
      your /usr/local/apache2/conf/httpd.conf to include:

      ServerName svn.myserver.org

      If you are using virtual hosting through Apache's NameVirtualHost
      directive, you may need to use the ServerAlias directive to specify
      additional names that your server is known by.

      If you have configured mod_deflate to be in the server, you can enable
      compression support for your repository by adding the following line
      to your Location block:

          SetOutputFilter DEFLATE


      NOTE: If you are unfamiliar with an Apache directive, or not exactly
      sure about what it does, don't hesitate to look it up in the
      documentation: http://httpd.apache.org/docs-2.2/mod/directives.html.

      NOTE: Make sure that the user 'nobody' (or whatever UID the
      httpd process runs as) has permission to read and write the
      Berkeley DB files!  This is a very common problem.


  D.  Running and Testing
      -------------------

      Fire up apache 2:

          $ /usr/local/apache2/bin/apachectl stop
          $ /usr/local/apache2/bin/apachectl start

      Check /usr/local/apache2/logs/error_log to make sure it started
      up okay.

      Try doing a network checkout from the repository:

          $ svn co http://localhost/svn/repos wc

      The most common reason this might fail is permission problems
      reading the repository db files.  If the checkout fails, make
      sure that the httpd process has permission to read and write to
      the repository.  You can see all of mod_dav_svn's complaints in
      the Apache error logfile, /usr/local/apache2/logs/error_log.

      To run the regression test suite for networked Subversion, see
      the instructions in subversion/tests/cmdline/README.
      For advice about tracing problems, see "Debugging the server" in
      http://subversion.apache.org/docs/community-guide/.


  E.  Alternative:  'svnserve' and ra_svn
      -----------------------------------

      An alternative network layer is libsvn_ra_svn (on the client
      side) and the 'svnserve' process on the server.  This is a
      simple network layer that speaks a custom protocol over plain
      TCP (documented in libsvn_ra_svn/protocol):

         $ svnserve -d     # becomes a background daemon
         $ svn checkout svn://localhost/usr/local/svn/repository

      You can use the "-r" option to svnserve to set a logical root
      for repositories, and the "-R" option to restrict connections to
      read-only access.  ("Read-only" is a logical term here; svnserve
      still needs write access to the database in this mode, but will
      not allow commits or revprop changes.)

      'svnserve' has built-in CRAM-MD5 authentication (so you can use
      non-system accounts), and can also be tunneled over SSH (so you
      can use existing system accounts).  It's also capable of using
      Cyrus SASL if libsasl2 is detected at ./configure time.  Please
      read chapter 6 in the Subversion Book
      (http://svnbook.red-bean.com) for details on these features.



IV.   PLATFORM-SPECIFIC ISSUES
      ========================

  A.  Windows XP
      ----------

      There is an error in the Windows XP TCP/IP stack which causes
      corruption in certain cases.  This problem is exposed only
      through ra_dav.

      The root of the matter is caused by duplicating file handles
      between parent and child processes.  The httpd Apache group
      explains this a lot better:

          http://www.apache.org/dist/httpd/binaries/win32/#xpbug

      And there's an item about this in the Subversion FAQ:

          http://subversion.apache.org/faq.html#windows-xp-server

      The only known workaround for now is to update to Windows XP
      SP1 (or higher).


  B.  Mac OS X
      --------

      [TBD: Describe BDB 4.0.x problem]



V.    PROGRAMMING LANGUAGE BINDINGS (PYTHON, PERL, RUBY, JAVA)
      ========================================================

      For Python, Perl and Ruby bindings, see the file

          ./subversion/bindings/swig/INSTALL

      For Java bindings, see the file

          ./subversion/bindings/javahl/README
