configure: Add new option to specify path to swig bindings targets Before this commit, it was not possible to use distinct Python installations for the build system and test suite on the one hand, and for building language bindings against on the other hand. So we introduce new variable "SWIG_PY_PYTHON" for a target of the SWIG Python bindings and a configure option to specify it. Also, for the symmetry we introduce "SWIG_PL_PERL" and "SWIG_RB_RUBY" for the Perl and Ruby SWIG bindings, and options to specify them. * configure.ac (): - Use variables "SWIG_PL_PERL", "SWIG_PY_PYTHON", "SWIG_RB_RUBY" for targets of the SWIG Perl, Python, Ruby bindings instead of "PERL", "PYTHON", "RUBY". - Introduce --with-swig-perl, --with-swig-python, --with-swig-ruby options for setting variables "SWIG_PL_PERL", "SWIG_PY_PYTHON", "SWIG_RB_RUBY". * Makefile.in, build/ac-macros/swig.m4 (): Use variables "SWIG_PL_PERL", "SWIG_PY_PYTHON", "SWIG_RB_RUBY" for targets of the SWIG Perl, Python, Ruby bindings instead of "PERL", "PYTHON", "RUBY". * subversion/bindings/swig/INSTALL (BUILDING SWIG BINDINGS FOR SVN ON UNIX step 2): - Describe how to specify the path to the target language interpreters with the new options, instead of using environment variables. - Fix the name of glue libraries. Review by: danielsh Index: Makefile.in =================================================================== --- Makefile.in (revision 1878200) +++ Makefile.in (working copy) @@ -356,7 +356,7 @@ $(INSTALL_DATA) "$$i" $(DESTDIR)$(swig_pydir); \ done; \ fi; \ - $(PYTHON) -c 'import compileall; \ + $(SWIG_PY_PYTHON) -c 'import compileall; \ compileall.compile_dir("$(DESTDIR)$(swig_pydir)", 1, "$(swig_pydir)"); \ compileall.compile_dir("$(DESTDIR)$(swig_pydir_extra)", 1, \ "$(swig_pydir_extra)");' @@ -396,7 +396,8 @@ HTTPD_WHITELIST = @HTTPD_WHITELIST@ PYTHON = @PYTHON@ -PERL = @PERL@ +SWIG_PY_PYTHON = @SWIG_PY_PYTHON@ +SWIG_PL_PERL = @SWIG_PL_PERL@ JDK = @JDK@ JAVA = @JAVA@ @@ -412,7 +413,7 @@ javahl_tests_CLASSPATH=$(JAVA_CLASSPATH) javahl_compat_tests_CLASSPATH=$(JAVA_CLASSPATH) -RUBY = @RUBY@ +SWIG_RB_RUBY = @SWIG_RB_RUBY@ RUBY_MAJOR = @RUBY_MAJOR@ RUBY_MINOR = @RUBY_MINOR@ RDOC = @RDOC@ @@ -881,13 +882,13 @@ ./config.status subversion/bindings/swig/perl/native/Makefile.PL $(SWIG_PL_DIR)/native/Makefile: libsvn_swig_perl $(SWIG_PL_DIR)/native/Makefile.PL - cd $(SWIG_PL_DIR)/native; $(PERL) Makefile.PL PREFIX=$(prefix) + cd $(SWIG_PL_DIR)/native; $(SWIG_PL_PERL) Makefile.PL PREFIX=$(prefix) # There is a "readlink -f" command on some systems for the same purpose, # but it's not as portable (e.g. Mac OS X doesn't have it). These should # only be used where Python/Perl are known to be available. READLINK_PY=$(PYTHON) -c 'import sys,os; print(os.path.realpath(sys.argv[1]))' -READLINK_PL=$(PERL) -e 'use Cwd; print Cwd::realpath(shift)' +READLINK_PL=$(SWIG_PL_PERL) -e 'use Cwd; print Cwd::realpath(shift)' swig-pl: autogen-swig-pl $(SWIG_PL_DIR)/native/Makefile if test "`$(READLINK_PL) $(SWIG_PL_DIR)`" != "`$(READLINK_PL) $(SWIG_PL_SRC_DIR)`"; then \ @@ -943,7 +944,7 @@ check-swig-py: swig-py $(TEST_SHLIB_VAR_SWIG_PY) \ cd $(SWIG_PY_DIR); \ - $(PYTHON) $(SWIG_PY_SRC_DIR)/tests/run_all.py + $(SWIG_PY_PYTHON) $(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 @@ -968,7 +969,7 @@ $(TEST_SHLIB_VAR_SWIG_RB) \ cd $(SWIG_RB_DIR); \ check_rb() { \ - $(RUBY) -I $(SWIG_RB_SRC_DIR) $(SWIG_RB_SRC_DIR)/test/run-test.rb "$$@"; \ + $(SWIG_RB_RUBY) -I $(SWIG_RB_SRC_DIR) $(SWIG_RB_SRC_DIR)/test/run-test.rb "$$@"; \ }; \ if check_rb --help 2>&1 | grep -q -- --collector; then \ check_rb --collector=dir --verbose=$(SWIG_RB_TEST_VERBOSE); \ Index: build/ac-macros/swig.m4 =================================================================== --- build/ac-macros/swig.m4 (revision 1878200) +++ build/ac-macros/swig.m4 (working copy) @@ -104,11 +104,11 @@ SWIG_PY_LINK="none" SWIG_PY_OPTS="none" SWIG_PY_ERRMSG="check config.log for details" - if test "$PYTHON" != "none"; then + if test "$SWIG_PY_PYTHON" != "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="`$SWIG_PY_PYTHON ${abs_srcdir}/build/get-py-info.py --includes`" ]) SWIG_PY_INCLUDES="\$(SWIG_INCLUDES) $ac_cv_python_includes" @@ -137,17 +137,17 @@ 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="`$SWIG_PY_PYTHON ${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="`$SWIG_PY_PYTHON ${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="`$SWIG_PY_PYTHON ${abs_srcdir}/build/get-py-info.py --libs`" ]) SWIG_PY_LIBS="`SVN_REMOVE_STANDARD_LIB_DIRS($ac_cv_python_libs)`" @@ -159,7 +159,7 @@ # have the SWIG-generated files. 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)' && \ + $SWIG_PY_PYTHON -c 'import sys; sys.exit(0x3000000 > sys.hexversion)' && \ ac_cv_python_is_py3="yes" ]) @@ -195,15 +195,15 @@ fi SWIG_PL_ERRMSG="check config.log for details" - if test "$PERL" != "none"; then + if test "$SWIG_PL_PERL" != "none"; then AC_MSG_CHECKING([perl version]) dnl Note that the q() bit is there to avoid unbalanced brackets dnl which m4 really doesn't like. - PERL_VERSION="`$PERL -e 'q([[); print $]] * 1000000,$/;'`" + PERL_VERSION="`$SWIG_PL_PERL -e 'q([[); print $]] * 1000000,$/;'`" AC_MSG_RESULT([$PERL_VERSION]) if test "$PERL_VERSION" -ge "5008000"; then - SWIG_PL_INCLUDES="\$(SWIG_INCLUDES) `$PERL -MExtUtils::Embed -e ccopts`" - SWIG_PL_LINK="`$PERL -MExtUtils::Embed -e ldopts`" + SWIG_PL_INCLUDES="\$(SWIG_INCLUDES) `$SWIG_PL_PERL -MExtUtils::Embed -e ccopts`" + SWIG_PL_LINK="`$SWIG_PL_PERL -MExtUtils::Embed -e ldopts`" SWIG_PL_LINK="`SVN_REMOVE_STANDARD_LIB_DIRS($SWIG_PL_LINK)`" dnl SWIG Perl bindings successfully configured, clear the error message @@ -216,13 +216,13 @@ SWIG_RB_COMPILE="none" SWIG_RB_LINK="none" SWIG_RB_ERRMSG="check config.log for details" - if test "$RUBY" != "none"; then + if test "$SWIG_RB_RUBY" != "none"; then if test x"$SWIG_VERSION" = x"3""00""008"; then # Use a local variable to escape the '#' sign. ruby_swig_issue_602='https://subversion.apache.org/docs/release-notes/1.11#ruby-swig-issue-602' AC_MSG_WARN([Ruby bindings are known not to support swig 3.0.8; see $ruby_swig_issue_602]) fi - rbconfig="$RUBY -rrbconfig -e " + rbconfig="$SWIG_RB_RUBY -rrbconfig -e " for var_name in arch archdir CC LDSHARED DLEXT LIBS LIBRUBYARG \ rubyhdrdir rubyarchhdrdir sitedir sitelibdir sitearchdir libdir @@ -261,7 +261,7 @@ SWIG_RB_COMPILE="$SWIG_RB_COMPILE -Wno-int-to-pointer-cast" AC_CACHE_CHECK([how to link Ruby extensions], [svn_cv_ruby_link],[ - svn_cv_ruby_link="`$RUBY -e 'ARGV.shift; print ARGV.join(%q( ))' \ + svn_cv_ruby_link="`$SWIG_RB_RUBY -e 'ARGV.shift; print ARGV.join(%q( ))' \ $rbconfig_LDSHARED`" svn_cv_ruby_link="$rbconfig_CC $svn_cv_ruby_link" svn_cv_ruby_link="$svn_cv_ruby_link -shrext .$rbconfig_DLEXT" Index: configure.ac =================================================================== --- configure.ac (revision 1878200) +++ configure.ac (working copy) @@ -1272,19 +1272,19 @@ # Scripting and Bindings languages -# Python: Used for testsuite, and bindings +# Python: Used for testsuite AC_ARG_VAR([PYTHON], [Python interpreter command]) 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([Python 2.7 or later is required to run the testsuite.]) 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]) AC_MSG_WARN([to the Python executable, and re-run configure]) + PYTHON=none fi -AC_PATH_PROGS(PYTHON, "$PYTHON", none) +AC_SUBST(PYTHON) # The minimum version for the JVM runtime for our Java bytecode. JAVA_OLDEST_WORKING_VER='1.8' @@ -1291,16 +1291,91 @@ # SVN_CHECK_JDK sets $JAVA_CLASSPATH SVN_CHECK_JDK($JAVA_OLDEST_WORKING_VER) -AC_PATH_PROG(PERL, perl, none) +AC_ARG_WITH(swig_perl, +[AS_HELP_STRING([[--with-swig-perl[=PATH|auto|no]|--without-swig-perl]], + [specify path to SWIG bindings target Perl interpreter [default=auto]])], +[], +[ +if test "$PERL" = "no" -o "$PERL" = "none"; then + with_swig_perl=no + AC_MSG_WARN([Disabling the SWIG Perl bindings' build by setting the PERL]) + AC_MSG_WARN([environment variable to "none" is deprecated.]) + AC_MSG_WARN([]) + AC_MSG_WARN([Please use --without-swig-perl instead.]) +else + with_swig_perl=auto +fi +]) +case $with_swig_perl in + yes|auto|"") + AC_PATH_PROG(PERL, perl, none) + SWIG_PL_PERL="$PERL" + ;; + no|none) + SWIG_PL_PERL=none + ;; + *) + SWIG_PL_PERL="$with_swig_perl" + ;; +esac +AC_SUBST(SWIG_PL_PERL) -if test -n "$RUBY"; then - AC_PATH_PROG(RUBY, "$RUBY", none) +# Python: as a target of SWIG Python bindings +AC_ARG_WITH(swig_python, +[AS_HELP_STRING([[--with-swig-python[=PATH|auto|no]|--without-swig-python]], + [specify path to SWIG bindings target Python interpreter [default=auto]])], +[], +[ +if test "$PYTHON" = "no" -o "$PYTHON" = "none"; then + with_swig_python=no else - AC_PATH_PROGS(RUBY, ruby ruby1 ruby1.8 ruby18 ruby1.9 ruby19 ruby1.9.3 ruby193 ruby2 ruby2.0 ruby20 ruby2.1 ruby21 ruby2.2 ruby22 ruby2.3 ruby23 ruby2.4 ruby24, none) + with_swig_python=auto fi -if test "$RUBY" != "none"; then +]) +case $with_swig_python in + yes|auto|"") + SWIG_PY_PYTHON="$PYTHON" + ;; + no|none) + SWIG_PY_PYTHON=none + ;; + *) + SWIG_PY_PYTHON="$with_swig_python" + ;; +esac +AC_SUBST(SWIG_PY_PYTHON) + +AC_ARG_WITH(swig_ruby, +[AS_HELP_STRING([[--with-swig-ruby[=PATH|auto|no]|--without-swig-ruby]], + [specify path to SWIG bindings target Ruby interpreter [default=auto]])], +[], +[ +if test "$RUBY" = "no" -o "$RUBY" = "none"; then + with_swig_ruby=no + AC_MSG_WARN([Disabling the SWIG Ruby bindings' build by setting the RUBY]) + AC_MSG_WARN([environment variable to "none" is deprecated.]) + AC_MSG_WARN([]) + AC_MSG_WARN([Please use --without-swig-ruby instead.]) +else + with_swig_ruby=auto +fi +]) +case $with_swig_ruby in + yes|auto|"") + AC_PATH_PROGS(RUBY, ruby ruby1 ruby1.8 ruby18 ruby1.9 ruby19 ruby1.9.3 ruby193 ruby2 ruby2.0 ruby20 ruby2.1 ruby21 ruby2.2 ruby22 ruby2.3 ruby23 ruby2.4 ruby24, none) + SWIG_RB_RUBY="$RUBY" + ;; + no|none) + SWIG_RB_RUBY=none + ;; + *) + SWIG_RB_RUBY="$with_swig_ruby" + ;; +esac +AC_SUBST(SWIG_RB_RUBY) +if test "$SWIG_RB_RUBY" != "none"; then AC_MSG_CHECKING([rb_hash_foreach]) - if "$RUBY" -r mkmf -e 'exit(have_func("rb_hash_foreach") ? 0 : 1)' >/dev/null; then + if "$SWIG_RB_RUBY" -r mkmf -e 'exit(have_func("rb_hash_foreach") ? 0 : 1)' >/dev/null; then AC_MSG_RESULT([yes]) if test -n "$RDOC"; then AC_PATH_PROG(RDOC, "$RDOC", none) @@ -1308,17 +1383,17 @@ AC_PATH_PROGS(RDOC, rdoc rdoc1 rdoc1.8 rdoc18 rdoc1.9 rdoc19 rdoc1.9.3 rdoc193 rdoc2 rdoc2.0 rdoc20 rdoc2.1 rdoc21 rdoc2.2 rdoc22 rdoc2.3 rdoc23 rdoc2.4 rdoc24, none) fi AC_CACHE_CHECK([for Ruby major version], [svn_cv_ruby_major],[ - svn_cv_ruby_major="`$RUBY -rrbconfig -e 'print RbConfig::CONFIG.fetch(%q(MAJOR))'`" + svn_cv_ruby_major="`$SWIG_RB_RUBY -rrbconfig -e 'print RbConfig::CONFIG.fetch(%q(MAJOR))'`" ]) RUBY_MAJOR="$svn_cv_ruby_major" AC_CACHE_CHECK([for Ruby minor version], [svn_cv_ruby_minor],[ - svn_cv_ruby_minor="`$RUBY -rrbconfig -e 'print RbConfig::CONFIG.fetch(%q(MINOR))'`" + svn_cv_ruby_minor="`$SWIG_RB_RUBY -rrbconfig -e 'print RbConfig::CONFIG.fetch(%q(MINOR))'`" ]) RUBY_MINOR="$svn_cv_ruby_minor" AC_CACHE_CHECK([for Ruby teeny version], [svn_cv_ruby_teeny],[ - svn_cv_ruby_teeny="`$RUBY -rrbconfig -e 'major, minor, teeny = RUBY_VERSION.split("."); print teeny;'`" + svn_cv_ruby_teeny="`$SWIG_RB_RUBY -rrbconfig -e 'major, minor, teeny = RUBY_VERSION.split("."); print teeny;'`" ]) RUBY_TEENY="$svn_cv_ruby_teeny" @@ -1327,13 +1402,13 @@ AC_SUBST(RUBY_TEENY) if test \( "$RUBY_MAJOR" -eq "1" -a "$RUBY_MINOR" -gt "8" -a "$RUBY_TEENY" -lt "3" \); then # Disallow Ruby between 1.8.7 and 1.9.3 - RUBY="none" + SWIG_RB_RUBY="none" AC_MSG_WARN([The detected Ruby is between 1.9 and 1.9.3]) AC_MSG_WARN([Only 1.8.x and 1.9.3 or later are supported at this time]) fi else AC_MSG_RESULT([no]) - RUBY="none" + SWIG_RB_RUBY="none" AC_MSG_WARN([The detected Ruby is too old for Subversion to use]) AC_MSG_WARN([A Ruby which has rb_hash_foreach is required to use the]) AC_MSG_WARN([Subversion Ruby bindings]) Index: subversion/bindings/swig/INSTALL =================================================================== --- subversion/bindings/swig/INSTALL (revision 1878200) +++ subversion/bindings/swig/INSTALL (working copy) @@ -145,18 +145,22 @@ It tries to detect SWIG near the very end of its output. You can find it by running 'grep "^SWIG=" config.log'. - Also make sure that the configure script sees the paths to the perl and/or - python executable you used to configure SWIG as above. If it does not then - you can specify the correct path by adding PYTHON=/path/to/python or - PERL=/path/to/perl onto the command line for configure. For example: - ./configure PYTHON=/usr/bin/python3.7 PERL=/usr/bin/perl5.28.2 + Also make sure that the configure script sees the paths to the perl, + ruby, and/or python executable you used to configure SWIG as above. + If it does not then you can specify the correct path by specifying + --with-swig-python=/path/to/python, --with-swig-perl=/path/to/perl, + and/or --with-swig-ruby=/path/to/ruby to the command line for configure. + For example: + ./configure --with-swig-python=/usr/bin/python3.7 \ + --with-swig-perl=/usr/bin/perl5.28.2 \ + --with-swig-ruby=/usr/bin/ruby2.7 If Subversion's ./configure finds a SWIG that it's happy with, then it will build special glue libraries to link svn to the swig bindings: - libsvn_swig_py.so (for Python) - libsvn_swig_perl.so (for Perl) + libsvn_swig_py-1.so (for Python) + libsvn_swig_perl-1.so (for Perl) + libsvn_swig_ruby-1.so (for Ruby) - Step 3: Install Specific Language Bindings * Python @@ -209,10 +213,10 @@ * Perl Perl 5.8.0 is required. You can specify the perl binary by passing - PERL=/path/to/perl as part of the configure command in the top level - of the Subversion source tree. Make sure that the Perl version used - is the same one that you configured SWIG to run against during the - SWIG configure (see above). + --with-swig-perl=/path/to/perl as an option of the configure command + in the top level of the Subversion source tree. Make sure that the + Perl version used is the same one that you configured SWIG to run + against during the SWIG configure (see above). 1. Run `make swig-pl' from the top of the Subversion build tree. @@ -251,10 +255,11 @@ 3. To install, run `make install-swig-rb' from the top of the Subversion build tree. - You can specify the ruby binary by passing RUBY=/path/to/ruby as part - of the configure command in the top level of the Subversion source - tree. Make sure that the Ruby version used is the same one that you - configured SWIG to run against during the SWIG configure (see above). + You can specify the ruby binary by passing --with-swig-ruby=/path/to/ruby + as an option of the configure command in the top level of the + Subversion source tree. Make sure that the Ruby version used is + the same one that you configured SWIG to run against during the + SWIG configure (see above). BUILDING SWIG BINDINGS FOR SVN ON WINDOWS