               ======================================
                      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 Httpd
       B. Making and Installing the Subversion Apache Server Module
       C. Configuring Apache Httpd 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:

         https://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.

      * utf8proc  (REQUIRED for client and server)
      
         Subversion uses utf8proc for UTF-8 support, including Unicode
         normalization.

      * Apache Serf  (OPTIONAL for client)

         The Apache 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 Apache Serf) in addition to unencrypted http:// URLs.
         To use SSL with Subversion's WebDAV server, Apache needs to be
         compiled with OpenSSL as well.

      * Netwide Assembler (OPTIONAL for client and server)

        The Netwide Assembler (NASM) is used to build the (optional)
        assembler modules of OpenSSL.  As of OpenSSL 1.1.0 NASM is the
        only supported assembler.

      * Berkeley DB (DEPRECATED and OPTIONAL for client and server)

         When you create a repository, you have the option of
         specifying a storage 'back-end' implementation.  Currently,
         there are two options.  The newer and recommended one, known
         as FSFS, does not require Berkeley DB.  FSFS stores data in a
         flat filesystem.  The older implementation, known as BDB, has
         been deprecated and is not recommended for new repositories,
         but is still available.  BDB stores data in a Berkeley DB
         database.  This back-end will only be available if the BDB
         libraries are discovered at compile time.

      * 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.

      * py3c (OPTIONAL, but REQUIRED for Python bindings)

        The Python 3 Compatibility Layer for C Extensions is required
        to build the Python language bindings.

      * KDE Framework 5, libsecret, GNOME Keyring (OPTIONAL for client)

         Subversion contains optional support for storing passwords in
         KWallet via KDE Framework 5 libraries (preferred) or kdelibs4,
         and GNOME Keyring via libsecret (preferred) or GNOME APIs.

      * 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.



  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.4 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:

          https://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.  SQLite  (REQUIRED)

      Subversion requires SQLite version 3.24.0 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:

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


      3.  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/


      4.  utf8proc  (REQUIRED)

      Subversion uses utf8proc for UTF-8 support.  Configure will
      attempt to locate utf8proc by default using pkg-config and known
      paths.

      If it is installed in a non-standard location, then use:

        --with-utf8proc=/path/to/libutf8proc

      Alternatively, a copy of utf8proc comes bundled with the
      Subversion sources.  If configure should use the bundled copy,
      use:

        --with-utf8proc=internal


      5.  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.


      6.  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.


      7.  Apache 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
      Apache 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.

      Apache Serf can be obtained via your system's package distribution
      system or directly from https://serf.apache.org/.

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


      8.  OpenSSL  (OPTIONAL)

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

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

        a. Using OpenSSL on the client through Apache Serf

          On Unix systems, to build Apache 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 Apache 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:

          https://www.openssl.org/


      9.  Berkeley DB 4.X  (DEPRECATED and OPTIONAL)

      You need the Berkeley DB libraries only if you are building a
      Subversion server that supports the older BDB repository storage
      back-end, or a Subversion client that can access local BDB
      repositories via the file:// URI scheme.

      The BDB back-end has been deprecated and is not recommended for
      new repositories.  BDB may be removed in Subversion 2.0.  We
      recommend the newer FSFS back-end for all new repositories.
      FSFS does not require the Berkeley DB libraries.

      If in doubt, the 'svnadmin info' command, added in Subversion
      1.9, can identify whether an existing repository uses BDB or
      FSFS.

      The current recommended version of Berkeley DB 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/technetwork/database/database-technologies/berkeleydb/overview/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.


      10. 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/


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

          (https://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.


      12. Python 3.x or newer (https://www.python.org/)  (OPTIONAL)

      Subversion does not require Python for its basic operation.
      However, Python is required for building and testing Subversion
      and for using Subversion's SWIG Python bindings or hook scripts
      coded in Python.

      The majority of Subversion's test suite is written in Python, as
      is part of Subversion's build system.

      In more detail, Python is required to do any of the following:

      * Use the SWIG Python bindings.
      * Use the ctypes Python bindings.
      * Use hook scripts coded in Python.
      * Build Subversion from a tarball on Unix-like systems and run
        Subversion's test suite as described in section II.B.
      * Build Subversion on Windows as described in section II.E.
      * Build Subversion from a working copy checked out from
        Subversion's own repository (whether or not running the test
        suite).
      * Build the SWIG Python bindings.
      * Build the ctypes Python bindings.
      * Testing as described in section III.D.

      The Python bindings are used by:

      * Third-party programs (e.g., ViewVC)
      * Scripts distributed with Subversion itself in the tools/
        subdirectory.
      * Any in-house scripts you may have.

      Python is NOT required to do any of the following:

      * Use the core command-line binaries (svn, svnadmin, svnsync,
        etc.)
      * Use Subversion's C libraries.
      * Use any of Subversion's other language bindings.
      * Build Subversion from a tarball on Unix-like systems without
        running Subversion's test suite

      Although this section calls for Python 3.x, Subversion still
      technically works with Python 2.7.  However, Support for Python
      2.7 is being phased out.  As of 1 January 2020, Python 2.7 has
      reached end of life.  All users are strongly encouraged to move
      to Python 3.

      Note: If you are using a Subversion distribution tarball and want
      to build the Python bindings for Python 2, you should rebuild
      the build environment in non-release mode by running
      'sh autogen.sh' before running the ./configure script; see
      section II.B for more about autogen.sh.


      13. 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.


      14. pkg-config  (Unix only, OPTIONAL)

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


      15. 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.


      16. Qt 5 or 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.


      17. KDE 5 Framework libraries or KDELibs 4  (Unix only, OPTIONAL)

      Subversion contains optional support for storing passwords in KWallet.
      Subversion will look for KF5Wallet, KF5CoreAddons, KF5I18n APIs by default,
      and needs kf5-config to find them. The KDELibs 4 api is also supported.
      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


      18. 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.


      19. 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`.


      20. 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.


      21. 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


      22. LZ4 (OPTIONAL)

      Subversion uses LZ4 compression library version r129 or above. Configure
      will attempt to locate the system library by default using pkg-config
      and known paths.

      If it is installed in a non-standard location, then use:

        --with-lz4=/path/to/liblz4

      If configure should use the version bundled with the sources, use:
        --with-lz4=internal


      23. py3c (OPTIONAL)

      Subversion uses the Python 3 Compatibility Layer for C
      Extensions (py3c) library when building the Python language
      bindings.
      
      As py3c is a header-only library, it is needed only to build the
      bindings, not to use them.

      Configure will attempt to locate py3c by default using
      pkg-config and known paths.

      If it is installed in a non-standard location, then use:

          --with-py3c=/path/to/py3c/prefix

      The library can be downloaded from GitHub:

          https://github.com/encukou/py3c
      
      On Unix systems, you can also use the provided get-deps.sh
      script to download py3c and several other dependencies; see the
      top of section I.C for more about get-deps.sh.


  D. Documentation

      The primary documentation for Subversion is the free book
      "Version Control with Subversion", a.k.a. "The Subversion Book",
      obtainable from https://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:

          https://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 or self-extracting installer via:

      https://subversion.apache.org/packages.html#windows

      For a Zip file extract the DLLs and EXEs to a directory of your
      choice. Included in the download are among other tools the SVN
      client, the SVNADMIN administration tool and the SVNLOOK reporting
      tool.

      You may 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

      * Microsoft Visual Studio. Any recent (2005+) version containing the
        Visual C++ component will work (E.g. Professional, Express, Community
        Edition). Make sure you enable C++ support during setup.
      * Python 2.7 or higher, downloaded from https://www.python.org/ which is
        used to generate the project files.
      * Perl 5.8 or higher from https://www.perl.org/get.html
      * Awk (from https://www.cs.princeton.edu/~bwk/btl.mirror/awk95.exe) is
        needed to compile Apache.  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.4 or later (1.2 for apr-iconv). If you are building from a Subversion
        checkout and have not downloaded Apache 2, then get these 3 libraries
        from https://www.apache.org/dist/apr/.
      * SQLite 3.24.0 or higher from https://www.sqlite.org/download.html
        (3.39.4 or higher recommended)
      * ZLib 1.2 or higher is required and can be obtained from
        http://www.zlib.net/
      * Either a Subversion client binary from
        https://subversion.apache.org/packages.html to do the initial checkout
        of the Subversion source or the zip file source distribution.

      Additional Options

      * [Optional] Apache Httpd 2 source, downloaded from
        https://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] Berkeley DB for backend support of the server components
        are available from
        http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index-082944.html
        (Version 4.4.20 or in specific cases some higher version recommended)
        For more information see Section I.C.7.
      * [Optional] Openssl can be obtained from https://www.openssl.org/source/
      * [Optional] NASM can be obtained from http://www.nasm.us/
      * [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).

  E.2 Notes

      The Apache 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 Python and add it to your path
      * Install Perl (it should add itself to the path)
        ### Subversion doesn't need perl. Only some dependencies need it
            (OpenSSL and some apr scripts)
      * 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.
        ### Subversion doesn't need awk. Only some dependencies need it
            (some apr scripts)
      * [Optional] Install NASM and add it to your path
        ### Subversion doesn't need NASM. Only some dependencies need it
            optionally (OpenSSL)
      * [Optional] If you checked out Subversion from the repository and want
        to build Subversion with http/https access support then install the
        Apache 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.
        ### Just use --with-serf instead of the hardcoded 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.
        ### Just use --with-apr, etc. instead of the hardcoded paths
      * Extract the ZLib sources into SVN\zlib if you are not using the zlib
        included in the dependencies zip file.
        ### Just use --with-zlib instead of the hardcoded path
      * [Optional] If you want secure connection (https) client support extract
        OpenSSL into SVN\openssl
        ### And pass the path to both serf and gen-make.py
      * [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.        
      * Download the SQLite amalgamation from
        https://www.sqlite.org/download.html
        and extract it into SVN\sqlite-amalgamation.
        See I.C.12 for alternatives to using the amalgamation package.

  E.4 Building the Binaries

      To build the binaries either follow these instructions.

      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:\Python27
      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 < 1.1.0

      C:>cd openssl
      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.
             Also if you are using OpenSSL >= 1.0.0 masm is no longer
             supported. You will have to use do_nasm or do_ms in this case.

      OpenSSL >= 1.1.0

      C:>cd openssl
      C:>perl Configure VC-WIN32
      C:>nmake
      C:>nmake test
      C:>cd ..

      Apache 2

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

      ### FIXME Apache 2.2 or greater required. Old build instructions for VC6.

      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 refer 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 refer 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.

      Please note that you MUST NOT build ZLib with the included assembler
      optimized code. It is known to be buggy, see for example the discussion
      https://svn.haxx.se/dev/archive-2013-10/0109.shtml.
      This means that you must not define ASMV or ASMINF. Note that the VS
      projects in contrib\visualstudio define these in the Debug configuration.

      Apache Serf

      ### Section about Apache Serf might be required/useful to add.
      ### scons is required too and Apache 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 msbuild command.
      * 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.
      * 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 --vsnet-version=20xx --with-berkeley-db=db4-win32
          --with-openssl=..\openssl --with-zlib=..\zlib
          --with-libintl=..\svn-win32-libintl

      Then build subversion:

      C:>msbuild subversion_vcnet.sln /t:__MORE__ /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 Httpd
      -----------------------

      1.  Obtaining and Installing Apache Httpd 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:

          https://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 Httpd for Subversion
      ---------------------------------------

      The following section is an abbreviated version of the
      information in the Subversion Book
      (https://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:
      https://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:
      https://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: https://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
      https://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
      (https://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:

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

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

          https://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
