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