Hi, I made a patch to separate build SWIG bindings for Python 2 and
Python 3 on Unix/Linux.

With this patch:
* configure (and make) variable PYTHON in Makefile is used only for
 preparation of build system and running testsuite.
* New configure VARIABLE PYTHON2, PYTHON3 are added for building
  py2 and py3 bindings respectively.
* Targets 'swig-py' and '*-swig-py' are used only for Python 3.
* New targets 'swig-py2' and '*-swig-py2' for Python 2 are added.
* Source codes generated by SWIG for Python 2 bindings are
  placed under 'subversion/bindings/swig/python2' in source tree.
* SWIG python bindings for py2 are built under
  'subversion/bindings/swig/python2' in build tree.
* External support library for SWIG Python 2 bindings libsvn_swig_py is
  renamed to libsvn_swig_py2
* Fix 'autogen.sh --release' by passing SWIG_PY_OPTS value for SWIG 3.x
 when it executes'make autogen-swig'.
* The 'autogen-swig' target also genarates source code for Python 2
 bindings.

Known issues:
* autogen-swig-py, autogen-swig-py2, install-swig-py, install-swig-py2
 targets fails when they executed in build tree out of source tree.
 (existing, not resolved)
* Two extra symbolic links is required to share source files between
 py2 and py3
* 3.0.10 <= SWIG < 4.0.0 is needed to run 'autogen.sh --release' but
 not checked the version of 'swig' in command search path.

There is other choice that assign swig-py to py2 and swig-py3 to py3,
but I have no idea which is better. If this one is better, I'll make
a patch for it.

I tested 'make check-swig-py2' and make 'check-swig-py3' on FreeBSD
with PYTHON=python2.7 and PYTHON=python3.7m, and they were passd.

I hope this will help to continue non-positive support for Python 2.

Thanks,
--
Yasuhito FUTATSUKI <futat...@yf.bsdclub.org>/<futat...@poem.co.jp>
Separate SWIG Python 2 bindings as swig-py2

* Makefile.in (PYTHON2, PYTHON3): New variables. 
 (swig_py2_libdir, swig_py2dir, swig_py2dir_extra,
 SWIG_PY2_INCLUDES, SWIG_PY2_LIBS, SWIG_PY2_ERRMSG, SWIG_PY2_FEATURS,
 SWIG_PY2_OPTS, TEST_SH_LIB_VAR_SWIG_PY2, COMPILE_PY2_WRAPPER,
 LINK_PY2_WRAPPER, INSTALL_SWIG_PY2, INSTALL_SWIG_PY2_LIB,
 INSTALL_EXTRA_SWIG_PY2, SWIG_PY2_DIR, SWIG_PY2_SRC_DIR,
 EXTRA_CLEAN_SWIG_PY2): New variables, copied from for each variable of name
 without '2', with appropriate substitution of corresponding variables.
 (install-swig-py2:, $(SWIG_PY2_DIR)/libsvn:, copy-swig-py2:, swig-py2:,
  check-swig-py2:, clean-swig-py2:, extraclean-swig-py2:): New targets.
 (extraclean-bindings:) Add new dependency to extraclean-swig-py2
 (clean-swig:) Add new dependency to clean-swig-py2
 (fast-clean:) Add new directories to search target for .pyc files
 (INSTALL_EXTRA_SWIG_PY, check-swig-py:): Use $(PYTHON3) instead of $(PYTHON)

* autogen.sh: Pass SWIG_Y_OPTS macro value for SWIG 3 to make autogen-swig

* build/ac-macros/swig.m4 (Anywhere): Remove extra white space on end of line.
 (SVN_FIND_SWIG): Separate check for Python 3 and Python 2. 
 (SVN_FIND_SWIG): Remove common options from SWIG_PY_OPTS. Common options are
 moved to swig-python-opts in build.conf again.
 (SWIG_PY2_INCLUDE, SWIG_PY2_COMPILE, SWIG_PY2_LINK, SWIG_PY2_LIBS,
 SWIG_PY2_ERRMSG): New variables to export.

* build/find_python.sh
 - Add new options '-2' and '-3', '-2' finds only Python 2.7 and '-3' finds
  only Python 3 and above respectively. 
 - Be lower priority $PYTHON2 and python

* build/generator/gen_base.py
 (lang_abbrev, lang_full_name,lang_utillib_suffix): Add new language "pyhton2".
 (TargetSWIG.add_dependencies): Treat "python2" in self.lang just same as
 "python".

* build/generator/swig/__init__.py
 (Generator.langs, Generator.short): Add new entry "python2".

* build/generator/swig/external_runtime.py
 (Generator.write_external_runtime):
 - Replace from "python" to "python2" in dict runtime_library. This is used
  only if SWIG version is 1.3.24
 - Adjust language name option for SWIG if lang is "python2".

* build.conf
 ([options] private-built-includes): Add new item
 'subversion/bindings/swig/proxy/swig_python2_external_runtime.swg'
 ([options] swig-python-opts):
  Add options commonly passed for Python 3. This is used only for Python 3 now. 
 ([options] swig-python2-opts): New option, for Python 2 only.
 ([options] swig-languages): Add new item 'python2'.
 ([swig_core], [swig_client], [swig_delta], [swig_diff], [swig_fs], [swig_fs],
  [swig_ra], [swig_repos], [swig_wc] libs): Add new item 'libsvn_swig_py2' 
 ([libsvn_swig_py2]: New target.

* configure.ac
 - Seprate check for Python, PYTHON to run the testsuites, PYTHON2 and
  PYTHON3 to build bindings.
 - Add New variable SWIG_PY2_FEATURES to export (but actually not set/used).

* subversion/bindings/swig/python2 
  New source/build directory to build Python 2 bindings separately

* subversion/bindings/swig/python2/libsvn_swig_py/
  New source/build directory to build external shared library for Python 2
  bindings modules.

* subversion/bindings/swig/python2/libsvn_swig_py/swigutil_py.c
 New symbolic link to share source with Python 3 bindings 
 
* subversion/bindings/swig/python2/svn
 New symbolic link to share support Python codes with Python 3 bindings 

Index: Makefile.in
===================================================================
--- Makefile.in (revision 1871026)
+++ Makefile.in (working copy)
@@ -85,12 +85,15 @@
 
 # where to install libsvn_swig_*
 swig_py_libdir = @libdir@
+swig_py2_libdir = @libdir@
 swig_pl_libdir = @libdir@
 swig_rb_libdir = @libdir@
 
 ### these possibly need further discussion
 swig_pydir = @libdir@/svn-python/libsvn
+swig_py2dir = @libdir@/svn-python2/libsvn
 swig_pydir_extra = @libdir@/svn-python/svn
+swig_py2dir_extra = @libdir@/svn-python2/svn
 swig_pldir = @libdir@/svn-perl
 swig_rbdir = $(SWIG_RB_SITE_ARCH_DIR)/svn/ext
 toolsdir = @bindir@/svn-tools
@@ -149,10 +152,13 @@
 
 SWIG = @SWIG@
 SWIG_PY_INCLUDES = @SWIG_PY_INCLUDES@ @SVN_PY3C_INCLUDES@ 
-I$(SWIG_SRC_DIR)/python/libsvn_swig_py
+SWIG_PY2_INCLUDES = @SWIG_PY2_INCLUDES@ @SVN_PY3C_INCLUDES@ 
-I$(SWIG_SRC_DIR)/python/libsvn_swig_py
 SWIG_PY_COMPILE = @SWIG_PY_COMPILE@
 SWIG_PY_LINK = @SWIG_PY_LINK@
 SWIG_PY_LIBS = @SWIG_PY_LIBS@
+SWIG_PY2_LIBS = @SWIG_PY_LIBS@
 SWIG_PY_ERRMSG = @SWIG_PY_ERRMSG@
+SWIG_PY2_ERRMSG = @SWIG_PY_ERRMSG@
 SWIG_PL_INCLUDES = @SWIG_PL_INCLUDES@
 SWIG_PL_ERRMSG = @SWIG_PL_ERRMSG@
 SWIG_RB_INCLUDES = @SWIG_RB_INCLUDES@ -I$(SWIG_SRC_DIR)/ruby/libsvn_swig_ruby
@@ -201,9 +207,11 @@
 SWIG_LDFLAGS = @SWIG_LDFLAGS@ $(EXTRA_SWIG_LDFLAGS)
 SWIG_FEATURES = @SWIG_FEATURES@
 SWIG_PY_FEATURES = @SWIG_PY_FEATURES@
+SWIG_PY2_FEATURES = @SWIG_PY2_FEATURES@
 SWIG_PL_FEATURES = @SWIG_PL_FEATURES@
 SWIG_RB_FEATURES = @SWIG_RB_FEATURES@
 SWIG_PY_OPTS = @SWIG_PY_OPTS@
+SWIG_PY2_OPTS = @SWIG_PY2_OPTS@
 
 COMPILE = $(CC) $(CMODEFLAGS) $(CPPFLAGS) $(CMAINTAINERFLAGS) $(CFLAGS) 
$(INCLUDES)
 COMPILE_NOWARN = $(CC) $(CMODEFLAGS) $(CPPFLAGS) $(CNOWARNFLAGS) $(CFLAGS) 
$(INCLUDES)
@@ -222,6 +230,7 @@
 
 # special compilation for files destined for libsvn_swig_* (e.g. swigutil_*.c)
 COMPILE_SWIG_PY = $(LIBTOOL) $(LTFLAGS) --mode=compile $(SWIG_PY_COMPILE) 
$(CPPFLAGS) $(LT_CFLAGS) -DSWIGPYTHON $(SWIG_PY_INCLUDES) $(INCLUDES) -o $@ -c
+COMPILE_SWIG_PY2 = $(LIBTOOL) $(LTFLAGS) --mode=compile $(SWIG_PY_COMPILE) 
$(CPPFLAGS) $(LT_CFLAGS) -DSWIGPYTHON $(SWIG_PY2_INCLUDES) $(INCLUDES) -o $@ -c
 COMPILE_SWIG_PL = $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) $(CPPFLAGS) 
$(CFLAGS) $(LT_CFLAGS) $(SWIG_PL_INCLUDES) $(INCLUDES) -o $@ -c
 COMPILE_SWIG_RB = $(LIBTOOL) $(LTFLAGS) --mode=compile $(SWIG_RB_COMPILE) 
$(CPPFLAGS) $(LT_CFLAGS) $(SWIG_RB_INCLUDES) $(INCLUDES) -o $@ -c
 
@@ -256,6 +265,17 @@
     done; \
     export @SVN_APR_SHLIB_PATH_VAR@; \
   fi;
+TEST_SHLIB_VAR_SWIG_PY2=\
+  if [ "@SVN_APR_SHLIB_PATH_VAR@" = "DYLD_LIBRARY_PATH" ]; then \
+    for d in $(SWIG_PY2_DIR)/libsvn_swig_py $(SWIG_PY2_DIR)/../../../libsvn_*; 
do \
+      if [ -n "$$DYLD_LIBRARY_PATH" ]; then \
+        @SVN_APR_SHLIB_PATH_VAR@="$$@SVN_APR_SHLIB_PATH_VAR@:$$d/.libs"; \
+      else \
+        @SVN_APR_SHLIB_PATH_VAR@="$$d/.libs"; \
+      fi; \
+    done; \
+    export @SVN_APR_SHLIB_PATH_VAR@; \
+  fi;
 TEST_SHLIB_VAR_SWIG_RB=\
   if [ "@SVN_APR_SHLIB_PATH_VAR@" = "DYLD_LIBRARY_PATH" ]; then \
     for d in $(SWIG_RB_DIR)/libsvn_swig_ruby $(SWIG_RB_DIR)/../../../libsvn_*; 
do \
@@ -303,10 +323,12 @@
 
 # Compilation of SWIG-generated C source code
 COMPILE_PY_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=compile $(SWIG_PY_COMPILE) 
$(LT_CFLAGS) $(CPPFLAGS) $(SWIG_PY_INCLUDES) -prefer-pic -c -o $@
+COMPILE_PY2_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=compile $(SWIG_PY_COMPILE) 
$(LT_CFLAGS) $(CPPFLAGS) $(SWIG_PY2_INCLUDES) -prefer-pic -c -o $@
 COMPILE_RB_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=compile $(SWIG_RB_COMPILE) 
$(LT_CFLAGS) $(CPPFLAGS) $(SWIG_RB_INCLUDES) -prefer-pic -c -o $@
 
 # these commands link the wrapper objects into an extension library/module
 LINK_PY_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=link $(SWIG_PY_LINK) 
$(SWIG_LDFLAGS) -rpath $(swig_pydir) -avoid-version -module
+LINK_PY2_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=link $(SWIG_PY_LINK) 
$(SWIG_LDFLAGS) -rpath $(swig_py2dir) -avoid-version -module
 LINK_RB_WRAPPER = $(LIBTOOL) $(LTFLAGS) --mode=link $(SWIG_RB_LINK) 
$(SWIG_LDFLAGS) -rpath $(swig_rbdir) -avoid-version -module
 
 LINK_JAVAHL_CXX = $(LIBTOOL) $(LTCXXFLAGS) --mode=link $(CXX) $(LT_LDFLAGS) 
$(CXXFLAGS) $(LDFLAGS) $(LT_CXX_LIBADD) -rpath $(libdir)
@@ -334,7 +356,9 @@
 
 ### this isn't correct yet
 INSTALL_SWIG_PY = $(INSTALL_LIB)
+INSTALL_SWIG_PY2 = $(INSTALL_LIB)
 INSTALL_SWIG_PY_LIB = $(INSTALL_LIB)
+INSTALL_SWIG_PY2_LIB = $(INSTALL_LIB)
 INSTALL_SWIG_PL_LIB = $(INSTALL_LIB)
 INSTALL_SWIG_RB = $(INSTALL_LIB)
 INSTALL_SWIG_RB_LIB = $(INSTALL_LIB)
@@ -356,20 +380,40 @@
       $(INSTALL_DATA) "$$i" $(DESTDIR)$(swig_pydir); \
     done; \
   fi; \
-  $(PYTHON) -c 'import compileall; \
+  $(PYTHON3) -c 'import compileall; \
     compileall.compile_dir("$(DESTDIR)$(swig_pydir)", 1, "$(swig_pydir)"); \
     compileall.compile_dir("$(DESTDIR)$(swig_pydir_extra)", 1, \
     "$(swig_pydir_extra)");'
+INSTALL_EXTRA_SWIG_PY2=\
+  $(MKDIR) $(DESTDIR)$(swig_py2dir); \
+  $(MKDIR) $(DESTDIR)$(swig_py2dir_extra); \
+  for i in $(abs_srcdir)/subversion/bindings/swig/python2/svn/*.py; do \
+    $(INSTALL_DATA) "$$i" $(DESTDIR)$(swig_py2dir_extra); \
+  done; \
+  for i in $(abs_srcdir)/subversion/bindings/swig/python2/*.py; do \
+    $(INSTALL_DATA) "$$i" $(DESTDIR)$(swig_py2dir); \
+  done; \
+  if test "$(abs_srcdir)" != "$(abs_builddir)"; then \
+    for i in $(abs_builddir)/subversion/bindings/swig/python2/*.py; do \
+      $(INSTALL_DATA) "$$i" $(DESTDIR)$(swig_py2dir); \
+    done; \
+  fi; \
+  $(PYTHON2) -c 'import compileall; \
+    compileall.compile_dir("$(DESTDIR)$(swig_py2dir)", 1, "$(swig_py2dir)"); \
+    compileall.compile_dir("$(DESTDIR)$(swig_py2dir_extra)", 1, \
+    "$(swig_py2dir_extra)");'
 
 # The path to generated and complementary source files for the SWIG
 # bindings.
 SWIG_PL_DIR = $(abs_builddir)/subversion/bindings/swig/perl
 SWIG_PY_DIR = $(abs_builddir)/subversion/bindings/swig/python
+SWIG_PY2_DIR = $(abs_builddir)/subversion/bindings/swig/python2
 SWIG_RB_DIR = $(abs_builddir)/subversion/bindings/swig/ruby
 
 # The path to the source files for the SWIG bindings
 SWIG_PL_SRC_DIR = $(abs_srcdir)/subversion/bindings/swig/perl
 SWIG_PY_SRC_DIR = $(abs_srcdir)/subversion/bindings/swig/python
+SWIG_PY2_SRC_DIR = $(abs_srcdir)/subversion/bindings/swig/python2
 SWIG_RB_SRC_DIR = $(abs_srcdir)/subversion/bindings/swig/ruby
 
 ### Automate JAR creation using Makefile generator's javahl-java.jar
@@ -396,6 +440,8 @@
 HTTPD_WHITELIST = @HTTPD_WHITELIST@
 
 PYTHON = @PYTHON@
+PYTHON2 = @PYTHON2@
+PYTHON3 = @PYTHON3@
 PERL = @PERL@
 
 JDK = @JDK@
@@ -456,6 +502,7 @@
         done
        echo $(CLEAN_FILES) | xargs rm -f --
        find $(CTYPES_PYTHON_SRC_DIR) $(SWIG_PY_SRC_DIR) $(SWIG_PY_DIR) \
+               $(SWIG_PY2_SRC_DIR) $(SWIG_PY2_DIR) \
                $(abs_srcdir)/build 
$(top_srcdir)/subversion/tests/cmdline/svntest \
                -name "*.pyc" -exec rm {} ';'
 
@@ -855,16 +902,18 @@
         done
 
 install-swig-py: install-swig-py-lib
+install-swig-py2: install-swig-py2-lib
 install-swig-rb: install-swig-rb-lib
 
 clean-bindings: clean-swig clean-ctypes-python clean-javahl
 
 extraclean-bindings: clean-swig extraclean-swig-headers \
-                       extraclean-swig-py extraclean-swig-rb \
-                       extraclean-swig-pl \
+                       extraclean-swig-py extraclean-swig-py2 \
+                       extraclean-swig-rb extraclean-swig-pl \
                        clean-ctypes-python clean-javahl \
 
-clean-swig: clean-swig-headers clean-swig-py clean-swig-rb clean-swig-pl
+clean-swig: clean-swig-headers clean-swig-py clean-swig-py2 clean-swig-rb \
+               clean-swig-pl
        @rm -f .swig_checked
 
 EXTRACLEAN_SWIG_HEADERS=rm -f $(SWIG_SRC_DIR)/proxy/*.swg
@@ -931,6 +980,9 @@
 $(SWIG_PY_DIR)/libsvn:
        mkdir $(SWIG_PY_DIR)/libsvn
 
+$(SWIG_PY2_DIR)/libsvn:
+       mkdir $(SWIG_PY2_DIR)/libsvn
+
 copy-swig-py: autogen-swig-py $(SWIG_PY_DIR)/libsvn
        @for f in $(SWIG_PY_SRC_DIR)/*.py $(SWIG_PY_DIR)/*.py; do \
          ! [ -f "$$f" ] || cp -pf $$f $(SWIG_PY_DIR)/libsvn; \
@@ -938,15 +990,31 @@
        @cd $(SWIG_PY_DIR)/libsvn;ln -sf ../.libs/*.so .
        @touch $(SWIG_PY_DIR)/libsvn/__init__.py
 
+copy-swig-py2: autogen-swig-py2 $(SWIG_PY2_DIR)/libsvn
+       @for f in $(SWIG_PY2_SRC_DIR)/*.py $(SWIG_PY2_DIR)/*.py; do \
+         ! [ -f "$$f" ] || cp -pf $$f $(SWIG_PY2_DIR)/libsvn; \
+       done
+       @cd $(SWIG_PY2_DIR)/libsvn;ln -sf ../.libs/*.so .
+       @touch $(SWIG_PY2_DIR)/libsvn/__init__.py
+
 swig-py: autogen-swig-py copy-swig-py
 
+swig-py2: autogen-swig-py2 copy-swig-py2
+
 check-swig-py: swig-py
        $(TEST_SHLIB_VAR_SWIG_PY) \
        cd $(SWIG_PY_DIR); \
-         $(PYTHON) $(SWIG_PY_SRC_DIR)/tests/run_all.py
+         $(PYTHON3) $(SWIG_PY_SRC_DIR)/tests/run_all.py
 
+check-swig-py2: swig-py2
+       $(TEST_SHLIB_VAR_SWIG_PY2) \
+       cd $(SWIG_PY2_DIR); \
+         $(PYTHON2) $(SWIG_PY_SRC_DIR)/tests/run_all.py
+
 EXTRACLEAN_SWIG_PY=rm -rf $(SWIG_PY_DIR)/svn_*.c $(SWIG_PY_DIR)/core.c \
                           $(SWIG_PY_DIR)/[a-z]*.py
+EXTRACLEAN_SWIG_PY2=rm -rf $(SWIG_PY2_DIR)/svn_*.c $(SWIG_PY2_DIR)/core.c \
+                          $(SWIG_PY2_DIR)/[a-z]*.py
 clean-swig-py:
        rm -f .swig_py_checked
        rm -rf $(SWIG_PY_DIR)/libsvn
@@ -959,9 +1027,24 @@
        done
        find $(SWIG_PY_SRC_DIR) $(SWIG_PY_DIR) -name "*.pyc" -exec rm {} ';'
 
+clean-swig-py2:
+       rm -f .swig_py2_checked
+       rm -rf $(SWIG_PY2_DIR)/libsvn
+       if test -z "$(RELEASE_MODE)"; then \
+         $(EXTRACLEAN_SWIG_PY2); \
+       fi
+       for d in $(SWIG_PY2_DIR) $(SWIG_PY2_DIR)/libsvn_swig_py; \
+       do \
+         [ -d $$d ] && cd $$d && rm -rf *.lo *.la *.o *.pyc .libs || true; \
+       done
+       find $(SWIG_PY2_SRC_DIR) $(SWIG_PY2_DIR) -name "*.pyc" -exec rm {} ';'
+
 extraclean-swig-py: clean-swig-py
        $(EXTRACLEAN_SWIG_PY)
 
+extraclean-swig-py2: clean-swig-py2
+       $(EXTRACLEAN_SWIG_PY2)
+
 swig-rb: autogen-swig-rb
 
 check-swig-rb: swig-rb svnserve
Index: autogen.sh
===================================================================
--- autogen.sh  (revision 1871026)
+++ autogen.sh  (working copy)
@@ -176,7 +176,10 @@
   "$PYTHON" ./gen-make.py build.conf || gen_failed=1
 
   # Build the SWIG-related files
-  make -f autogen-standalone.mk autogen-swig
+  #
+  # To do: check SWIG version and set appropriate value to SWIG_PY_OPTS 
+  # current value SWIG_PY_OPTS="-modern" is for SWIG < 4.0
+  make -f autogen-standalone.mk SWIG_PY_OPTS="-modern" autogen-swig
 
   # Remove the .swig_checked file
   rm -f .swig_checked
Index: build/ac-macros/swig.m4
===================================================================
--- build/ac-macros/swig.m4     (revision 1871026)
+++ build/ac-macros/swig.m4     (working copy)
@@ -21,7 +21,7 @@
 dnl
 dnl if it is, then check to see if we have the correct version of python.
 dnl
-dnl if we do, then set up the appropriate SWIG_ variables to build the 
+dnl if we do, then set up the appropriate SWIG_ variables to build the
 dnl python bindings.
 
 AC_DEFUN(SVN_CHECK_SWIG,
@@ -69,7 +69,7 @@
     fi
     if test ! -f "$SWIG" || test ! -x "$SWIG"; then
       AC_MSG_ERROR([Could not find swig binary at $SWIG])
-    fi 
+    fi
   fi
 
   if test "$SWIG" != "none"; then
@@ -78,7 +78,7 @@
                        $SED -ne 's/^.*Version \(.*\)$/\1/p'`"
     # We want the version as an integer so we can test against
     # which version we're using.  SWIG doesn't provide this
-    # to us so we have to come up with it on our own. 
+    # to us so we have to come up with it on our own.
     # The major is passed straight through,
     # the minor is zero padded to two places,
     # and the patch level is zero padded to three places.
@@ -99,16 +99,16 @@
       AC_MSG_WARN([Subversion requires SWIG >= 1.3.24])
     fi
   fi
- 
+
   SWIG_PY_COMPILE="none"
   SWIG_PY_LINK="none"
   SWIG_PY_OPTS="none"
   SWIG_PY_ERRMSG="check config.log for details"
-  if test "$PYTHON" != "none"; then
+  if test "$PYTHON3" != "none"; then
     AC_MSG_NOTICE([Configuring python swig binding])
 
     AC_CACHE_CHECK([for Python includes], [ac_cv_python_includes],[
-      ac_cv_python_includes="`$PYTHON ${abs_srcdir}/build/get-py-info.py 
--includes`"
+      ac_cv_python_includes="`$PYTHON3 ${abs_srcdir}/build/get-py-info.py 
--includes`"
     ])
     SWIG_PY_INCLUDES="\$(SWIG_INCLUDES) $ac_cv_python_includes"
 
@@ -137,52 +137,98 @@
           AC_MSG_WARN([py3c library not found; disabling python swig bindings])
         else
           AC_CACHE_CHECK([for compiling Python extensions], 
[ac_cv_python_compile],[
-            ac_cv_python_compile="`$PYTHON ${abs_srcdir}/build/get-py-info.py 
--compile`"
+            ac_cv_python_compile="`$PYTHON3 ${abs_srcdir}/build/get-py-info.py 
--compile`"
           ])
           SWIG_PY_COMPILE="$ac_cv_python_compile $CFLAGS"
-      
+
           AC_CACHE_CHECK([for linking Python extensions], [ac_cv_python_link],[
-            ac_cv_python_link="`$PYTHON ${abs_srcdir}/build/get-py-info.py 
--link`"
+            ac_cv_python_link="`$PYTHON3 ${abs_srcdir}/build/get-py-info.py 
--link`"
           ])
           SWIG_PY_LINK="$ac_cv_python_link"
-      
+
           AC_CACHE_CHECK([for linking Python libraries], [ac_cv_python_libs],[
-            ac_cv_python_libs="`$PYTHON ${abs_srcdir}/build/get-py-info.py 
--libs`"
+            ac_cv_python_libs="`$PYTHON3 ${abs_srcdir}/build/get-py-info.py 
--libs`"
           ])
           SWIG_PY_LIBS="`SVN_REMOVE_STANDARD_LIB_DIRS($ac_cv_python_libs)`"
 
-          AC_CACHE_CHECK([for Python >= 3], [ac_cv_python_is_py3],[
-            ac_cv_python_is_py3="no"
-            $PYTHON -c 'import sys; sys.exit(0x3000000 > sys.hexversion)' && \
-               ac_cv_python_is_py3="yes"
+          if test "$SWIG_VERSION" -ge "300010"; then
+            dnl SWIG Python bindings successfully configured, clear the error 
message dnl
+            SWIG_PY_ERRMSG=""
+          else
+            SWIG_PY_ERRMSG="SWIG version is not suitable"
+            AC_MSG_WARN([Subversion Python bindings for Python 3 require SWIG 
3.0.10 or newer])
+          fi
+          if test "$SWIG_VERSION" -lt "400000"; then
+            SWIG_PY_OPTS="-modern"
+          else
+            SWIG_PY_OPTS=""
+          fi
+        fi
+
+      fi
+    fi
+
+  fi
+
+  SWIG_PY2_COMPILE="none"
+  SWIG_PY2_LINK="none"
+  SWIG_PY2_ERRMSG="check config.log for details"
+  if test "$PYTHON2" != "none"; then
+    AC_MSG_NOTICE([Configuring python 2 swig binding])
+
+    AC_CACHE_CHECK([for Python 2 includes], [ac_cv_python2_includes],[
+      ac_cv_python2_includes="`$PYTHON2 ${abs_srcdir}/build/get-py-info.py 
--includes`"
+    ])
+    SWIG_PY2_INCLUDES="\$(SWIG_INCLUDES) $ac_cv_python2_includes"
+
+    if test "$ac_cv_python2_includes" = "none"; then
+      SWIG_PY2_ERRMSG="no distutils found"
+      AC_MSG_WARN([python 2 bindings cannot be built without distutils module])
+    else
+
+      python2_header_found="no"
+
+      save_cppflags="$CPPFLAGS"
+      CPPFLAGS="$CPPFLAGS $ac_cv_python2_includes"
+      AC_CHECK_HEADER(Python.h, [
+        python2_header_found="yes"
+      ])
+      CPPFLAGS="$save_cppflags"
+
+      if test "$python2_header_found" = "no"; then
+        SWIG_PY2_ERRMSG="no Python.h found"
+        AC_MSG_WARN([Python.h not found; disabling python 2 swig bindings])
+      else
+        SVN_PY3C()
+
+        if test "$py3c_found" = "no"; then
+          SWIG_PY_ERRMSG="py3c library not found"
+          AC_MSG_WARN([py3c library not found; disabling python swig bindings])
+        else
+          AC_CACHE_CHECK([for compiling Python 2 extensions], 
[ac_cv_python2_compile],[
+            ac_cv_python2_compile="`$PYTHON2 
${abs_srcdir}/build/get-py-info.py --compile`"
           ])
+          SWIG_PY2_COMPILE="$ac_cv_python2_compile $CFLAGS"
 
-          if test "$ac_cv_python_is_py3" = "yes"; then
-            if test "$SWIG_VERSION" -ge "300010"; then
-              dnl SWIG Python bindings successfully configured, clear the 
error message dnl
-              SWIG_PY_ERRMSG=""
-            else
-              SWIG_PY_ERRMSG="SWIG version is not suitable"
-              AC_MSG_WARN([Subversion Python bindings for Python 3 require 
SWIG 3.0.10 or newer])
-            fi
-            if test "$SWIG_VERSION" -lt "400000"; then
-              SWIG_PY_OPTS="-python -py3 -nofastunpack -modern"
-            else
-              SWIG_PY_OPTS="-python -py3 -nofastunpack"
-            fi
+          AC_CACHE_CHECK([for linking Python 2 extensions], 
[ac_cv_python2_link],[
+            ac_cv_python2_link="`$PYTHON2 ${abs_srcdir}/build/get-py-info.py 
--link`"
+          ])
+          SWIG_PY2_LINK="$ac_cv_python_link"
+
+          AC_CACHE_CHECK([for linking Python 2 libraries], 
[ac_cv_python2_libs],[
+            ac_cv_python2_libs="`$PYTHON2 ${abs_srcdir}/build/get-py-info.py 
--libs`"
+          ])
+          SWIG_PY2_LIBS="`SVN_REMOVE_STANDARD_LIB_DIRS($ac_cv_python2_libs)`"
+
+          if test "$SWIG_VERSION" -lt "400000"; then
+            dnl SWIG Python bindings successfully configured, clear the error 
message dnl
+            SWIG_PY2_ERRMSG=""
           else
-            if test "$SWIG_VERSION" -lt "400000"; then
-              SWIG_PY_OPTS="-python -classic"
-              dnl SWIG Python bindings successfully configured, clear the 
error message dnl
-              SWIG_PY_ERRMSG=""
-            else
-              SWIG_PY_OPTS="-python -nofastunpack"
-              SWIG_PY_ERRMSG="SWIG version is not suitable"
-              AC_MSG_WARN([Subversion Python bindings for Python 2 require 
1.3.24 <= SWIG < 4.0.0])
-            fi
+            SWIG_PY2_ERRMSG="SWIG version is not suitable"
+            AC_MSG_WARN([Subversion Python bindings for Python 2 require 
1.3.24 <= SWIG < 4.0.0])
           fi
         fi
-            
+
       fi
     fi
 
@@ -338,6 +384,11 @@
   AC_SUBST(SWIG_PY_LIBS)
   AC_SUBST(SWIG_PY_OPTS)
   AC_SUBST(SWIG_PY_ERRMSG)
+  AC_SUBST(SWIG_PY2_INCLUDES)
+  AC_SUBST(SWIG_PY2_COMPILE)
+  AC_SUBST(SWIG_PY2_LINK)
+  AC_SUBST(SWIG_PY2_LIBS)
+  AC_SUBST(SWIG_PY2_ERRMSG)
   AC_SUBST(SWIG_PL_INCLUDES)
   AC_SUBST(SWIG_PL_LINK)
   AC_SUBST(SWIG_PL_ERRMSG)
Index: build/find_python.sh
===================================================================
--- build/find_python.sh        (revision 1871026)
+++ build/find_python.sh        (working copy)
@@ -21,11 +21,28 @@
 #
 
 # Required version of Python
-VERSION=${1:-0x2070000}
+case $1 in
+  -2)
+    CANDIDATE="$PYTHON $PYTHON2 python python2"
+    MIN_VER=${2:-0x2070000}
+    MAX_VER="0x3000000"
+    break
+    ;;
+  -3)
+    CANDIDATE="$PYTHON $PYTHON3 python python3"
+    MIN_VER=${2:-0x3000000}
+    MAX_VER="0xffffffff"
+    ;;
+  *)
+    CANDIDATE="$PYTHON $PYTHON3 python python3 $PYTHON2 python2"
+    MIN_VER=${1:-0x2070000}
+    MAX_VER="0xffffffff"
+esac
 
-for pypath in "$PYTHON" "$PYTHON2" "$PYTHON3" python python2 python3; do
+for pypath in $CANDIDATE; do
   if [ "x$pypath" != "x" ]; then
-    DETECT_PYTHON="import sys;sys.exit((sys.hexversion < $VERSION) and 1 or 0)"
+    DETECT_PYTHON="import sys;\
+                   sys.exit(0 if $MIN_VER <= sys.hexversion < $MAX_VER else 1)"
     if "$pypath" -c "$DETECT_PYTHON" >/dev/null 2>/dev/null; then
       echo $pypath
       exit 0
Index: build/generator/gen_base.py
===================================================================
--- build/generator/gen_base.py (revision 1871026)
+++ build/generator/gen_base.py (working copy)
@@ -530,6 +530,7 @@
 
 lang_abbrev = {
   'python' : 'py',
+  'python2' : 'py2',
   'perl' : 'pl',
   'ruby' : 'rb',
   }
@@ -536,6 +537,7 @@
 
 lang_full_name = {
   'python' : 'Python',
+  'python2' : 'Python 2',
   'perl' : 'Perl',
   'ruby' : 'Ruby',
   }
@@ -542,6 +544,7 @@
 
 lang_utillib_suffix = {
   'python' : 'py',
+  'python2' : 'py2',
   'perl' : 'perl',
   'ruby' : 'ruby',
   }
@@ -814,7 +817,7 @@
     module_name = iname[:4] != 'svn_' and iname[:-2] or iname[4:-2]
 
     lib_extension = self.gen_obj._extension_map['lib', 'target']
-    if self.lang == "python":
+    if self.lang in ("python", "python2"):
       lib_extension = self.gen_obj._extension_map['pyd', 'target']
       lib_filename = '_' + module_name + lib_extension
     elif self.lang == "ruby":
Index: build/generator/swig/__init__.py
===================================================================
--- build/generator/swig/__init__.py    (revision 1871026)
+++ build/generator/swig/__init__.py    (working copy)
@@ -36,8 +36,8 @@
 
 class Generator:
   """Base class for SWIG-related generators"""
-  langs = ["python", "perl", "ruby"]
-  short = { "perl": "pl", "python": "py", "ruby": "rb" }
+  langs = ["python", "python2", "perl", "ruby"]
+  short = { "perl": "pl", "python": "py", "python2": "py2", "ruby": "rb" }
 
   def __init__(self, conf, swig_path):
     """Read build.conf"""
Index: build/generator/swig/external_runtime.py
===================================================================
--- build/generator/swig/external_runtime.py    (revision 1871026)
+++ build/generator/swig/external_runtime.py    (working copy)
@@ -64,7 +64,7 @@
 
     # Runtime library names
     runtime_library = {
-      "python": "pyrun.swg", "perl":"perlrun.swg", "ruby":"rubydef.swg"
+      "python2": "pyrun.swg", "perl":"perlrun.swg", "ruby":"rubydef.swg"
     }
 
     # Build runtime files to temporary location
@@ -81,7 +81,10 @@
         out_file.write(open("%s/runtime.swg" % self.proxy_dir).read())
       out_file.close()
     else:
-      subprocess.check_call([self.swig_path, "-"+lang, "-external-runtime", 
out])
+      if lang == "python2":
+        subprocess.check_call([self.swig_path, "-python", "-external-runtime", 
out])
+      else:
+        subprocess.check_call([self.swig_path, "-"+lang, "-external-runtime", 
out])
 
     # SWIG 1.3.24-27 should include rubyhead.swg in their
     # external runtime, but they don't.
Index: build.conf
===================================================================
--- build.conf  (revision 1871026)
+++ build.conf  (working copy)
@@ -63,6 +63,7 @@
         subversion/libsvn_subr/internal_statements.h
         subversion/tests/libsvn_wc/wc-test-queries.h
         subversion/bindings/swig/proxy/swig_python_external_runtime.swg
+        subversion/bindings/swig/proxy/swig_python2_external_runtime.swg
         subversion/bindings/swig/proxy/swig_perl_external_runtime.swg
         subversion/bindings/swig/proxy/swig_ruby_external_runtime.swg
         subversion/bindings/swig/proxy/rubyhead.swg
@@ -101,12 +102,14 @@
 
 bdb-test-scripts =
 
-swig-python-opts = $(SWIG_FEATURES) $(SWIG_PY_OPTS) $(SWIG_PY_FEATURES)
+swig-python-opts = $(SWIG_FEATURES) -python -py3 -nofastunpack $(SWIG_PY_OPTS) 
$(SWIG_PY_FEATURES)
+swig-python2-opts = $(SWIG_FEATURES) -python -classic $(SWIG_PY2_FEATURES)
 swig-perl-opts = $(SWIG_FEATURES) -perl $(SWIG_PL_FEATURES) -nopm -noproxy
 swig-ruby-opts = $(SWIG_FEATURES) -ruby $(SWIG_RB_FEATURES)
-swig-languages = python perl ruby
+swig-languages = python python2 perl ruby
 swig-dirs = 
         subversion/bindings/swig/python
+        subversion/bindings/swig/python2
         subversion/bindings/swig/perl
         subversion/bindings/swig/ruby
         subversion/bindings/swig/proxy
@@ -498,7 +501,7 @@
 type = swig
 path = subversion/bindings/swig
 sources = core.i
-libs = libsvn_swig_py libsvn_swig_perl libsvn_swig_ruby
+libs = libsvn_swig_py libsvn_swig_py2 libsvn_swig_perl libsvn_swig_ruby
        libsvn_diff libsvn_subr apr
 description = Subversion core library bindings
 
@@ -506,7 +509,7 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_client.i
-libs = libsvn_swig_py libsvn_swig_perl libsvn_swig_ruby
+libs = libsvn_swig_py libsvn_swig_py2 libsvn_swig_perl libsvn_swig_ruby
        libsvn_client libsvn_subr apr
 nonlibs = swig_core
 description = Subversion client library bindings
@@ -515,7 +518,7 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_delta.i
-libs = libsvn_swig_py libsvn_swig_perl libsvn_swig_ruby
+libs = libsvn_swig_py libsvn_swig_py2 libsvn_swig_perl libsvn_swig_ruby
        libsvn_delta libsvn_subr apr
 nonlibs = swig_core
 description = Subversion delta library bindings
@@ -524,7 +527,7 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_diff.i
-libs = libsvn_swig_py libsvn_swig_perl libsvn_swig_ruby
+libs = libsvn_swig_py libsvn_swig_py2 libsvn_swig_perl libsvn_swig_ruby
        libsvn_diff libsvn_subr apr
 nonlibs = swig_core
 description = Subversion diff library bindings
@@ -533,7 +536,7 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_fs.i
-libs = libsvn_swig_py libsvn_swig_perl libsvn_swig_ruby
+libs = libsvn_swig_py libsvn_swig_py2 libsvn_swig_perl libsvn_swig_ruby
        libsvn_fs libsvn_subr apr
 nonlibs = swig_core
 description = Subversion FS library bindings
@@ -542,7 +545,7 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_ra.i
-libs = libsvn_swig_py libsvn_swig_perl libsvn_swig_ruby
+libs = libsvn_swig_py libsvn_swig_py2 libsvn_swig_perl libsvn_swig_ruby
        libsvn_ra libsvn_subr apr
 nonlibs = swig_core
 description = Subversion RA library bindings
@@ -551,7 +554,7 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_repos.i
-libs = libsvn_swig_py libsvn_swig_perl libsvn_swig_ruby
+libs = libsvn_swig_py libsvn_swig_py2 libsvn_swig_perl libsvn_swig_ruby
        libsvn_repos libsvn_subr apr
 nonlibs = swig_core
 description = Subversion repository library bindings
@@ -560,7 +563,7 @@
 type = swig
 path = subversion/bindings/swig
 sources = svn_wc.i
-libs = libsvn_swig_py libsvn_swig_perl libsvn_swig_ruby
+libs = libsvn_swig_py libsvn_swig_py2 libsvn_swig_perl libsvn_swig_ruby
        libsvn_wc libsvn_subr apr
 nonlibs = swig_core
 description = Subversion WC library bindings
@@ -580,6 +583,21 @@
 msvc-export = ../bindings/swig/python/libsvn_swig_py/swigutil_py.h
 description = Subversion utility library for Python bindings
 
+# SWIG utility library for Python 2 modules
+[libsvn_swig_py2]
+type = swig_lib
+lang = python2
+path = subversion/bindings/swig/python2/libsvn_swig_py
+libs = libsvn_client libsvn_wc libsvn_ra libsvn_delta libsvn_subr
+       apriconv apr python2 swig
+link-cmd = $(LINK)
+install = swig-py2-lib
+# need special build rule to include -DSWIGPYTHON
+compile-cmd = $(COMPILE_SWIG_PY2)
+msvc-static = no
+msvc-export = ../bindings/swig/python2/libsvn_swig_py/swigutil_py.h
+description = Subversion utility library for Python 2 bindings
+
 # SWIG utility library for Perl modules
 [libsvn_swig_perl]
 type = swig_lib
Index: configure.ac
===================================================================
--- configure.ac        (revision 1871026)
+++ configure.ac        (working copy)
@@ -1274,11 +1274,12 @@
 
 # Python: Used for testsuite, and bindings
 AC_ARG_VAR([PYTHON], [Python interpreter command])
+AC_ARG_VAR([PYTHON2], [target Python 2 interpreter, to build bindigs])
+AC_ARG_VAR([PYTHON3], [target Python 3 interpreter, to build bindigs])
 
 PYTHON="`$abs_srcdir/build/find_python.sh`"
 if test -z "$PYTHON"; then
   AC_MSG_WARN([Python 2.7 or later is required to run the testsuite])
-  AC_MSG_WARN([or to use the Subversion Python bindings])
   AC_MSG_WARN([])
   AC_MSG_WARN([If you have a suitable Python installed, but not on the])
   AC_MSG_WARN([PATH, set the environment variable PYTHON to the full path])
@@ -1286,6 +1287,28 @@
 fi
 AC_PATH_PROGS(PYTHON, "$PYTHON", none)
 
+PYTHON2="`$abs_srcdir/build/find_python.sh -2`"
+if test -z "$PYTHON2"; then
+  AC_MSG_WARN([Python 2.7 or later in Python 2.x is required])
+  AC_MSG_WARN([to use the Subversion Python bindings for Python 2])
+  AC_MSG_WARN([])
+  AC_MSG_WARN([If you have a suitable Python installed, but not on the])
+  AC_MSG_WARN([PATH, set the environment variable PYTHON2 to the full path])
+  AC_MSG_WARN([to the Python executable, and re-run configure])
+fi
+AC_PATH_PROGS(PYTHON2, "$PYTHON2", none)
+
+PYTHON3="`$abs_srcdir/build/find_python.sh -3 0x3050000`"
+if test -z "$PYTHON3"; then
+  AC_MSG_WARN([Python 3.5 or later is required])
+  AC_MSG_WARN([to use the Subversion Python bindings for Python 3])
+  AC_MSG_WARN([])
+  AC_MSG_WARN([If you have a suitable Python installed, but not on the])
+  AC_MSG_WARN([PATH, set the environment variable PYTHON3 to the full path])
+  AC_MSG_WARN([to the Python executable, and re-run configure])
+fi
+AC_PATH_PROGS(PYTHON3, "$PYTHON3", none)
+
 # The minimum version for the JVM runtime for our Java bytecode.
 JAVA_OLDEST_WORKING_VER='1.8'
 # SVN_CHECK_JDK sets $JAVA_CLASSPATH
@@ -1346,6 +1369,7 @@
 AC_ARG_VAR(SWIG_RB_FEATURES, [SWIG feature flags specific to Ruby bindings])
 AC_ARG_VAR(SWIG_PL_FEATURES, [SWIG feature flags specific to Perl bindings])
 AC_ARG_VAR(SWIG_PY_FEATURES, [SWIG feature flags specific to Python bindings])
+AC_ARG_VAR(SWIG_PY2_FEATURES, [SWIG feature flags specific to Python 2 
bindings])
 
 SVN_CHECK_CTYPESGEN
 
Index: subversion/bindings/swig/python2/libsvn_swig_py/swigutil_py.c
===================================================================
--- subversion/bindings/swig/python2/libsvn_swig_py/swigutil_py.c       
(nonexistent)
+++ subversion/bindings/swig/python2/libsvn_swig_py/swigutil_py.c       
(working copy)
@@ -0,0 +1 @@
+link ../../python/libsvn_swig_py/swigutil_py.c
\ No newline at end of file

Property changes on: 
subversion/bindings/swig/python2/libsvn_swig_py/swigutil_py.c
___________________________________________________________________
Added: svn:special
## -0,0 +1 ##
+*
\ No newline at end of property
Index: subversion/bindings/swig/python2/svn
===================================================================
--- subversion/bindings/swig/python2/svn        (nonexistent)
+++ subversion/bindings/swig/python2/svn        (working copy)
@@ -0,0 +1 @@
+link ../python/svn
\ No newline at end of file

Property changes on: subversion/bindings/swig/python2/svn
___________________________________________________________________
Added: svn:special
## -0,0 +1 ##
+*
\ No newline at end of property

Reply via email to