You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2013/07/18 22:01:04 UTC
svn commit: r1504625 - in /subversion/trunk: build.conf
build/generator/gen_win.py build/generator/gen_win_dependencies.py
Author: rhuijben
Date: Thu Jul 18 20:01:04 2013
New Revision: 1504625
URL: http://svn.apache.org/r1504625
Log:
In the Windows project generator: Switch the perl, python and ruby linkage
detection to the generic library system to remove move more per project
custom code.
* build.conf
(libsvn_swig_py): Link to python.
(libsvn_swig_perl): Link to perl.
(libsvn_swig_ruby): Link to ruby.
(perl, python, ruby): New external libraries.
* build/generator/gen_win.py
(get_install_targets): Automatically drop swig targets based on language
support.
(get_linked_win_depends): Include the external libraries from swig libraries
in the individual swig modules.
(get_win_defines): Move the common defines to the top. Only declare
HAVE_RB_ERRINFO in ruby projects.
(get_win_includes): Remove language specific include handling.
(get_win_lib_dirs): Remove language specific libdir handling.
(get_win_libs): Remove language specific library knowledge.
[python uses a Visual C++ linker trick]
Suppress warnings for optional libraries when not found.
* build/generator/gen_win_dependencies.py
(find_libraries): Always locate languages.
(_find_perl,
_find_ruby,
_find_python): Tweak to new framework. Invoke perl just once.
(_find_serf): Generate proper path.
Modified:
subversion/trunk/build.conf
subversion/trunk/build/generator/gen_win.py
subversion/trunk/build/generator/gen_win_dependencies.py
Modified: subversion/trunk/build.conf
URL: http://svn.apache.org/viewvc/subversion/trunk/build.conf?rev=1504625&r1=1504624&r2=1504625&view=diff
==============================================================================
--- subversion/trunk/build.conf (original)
+++ subversion/trunk/build.conf Thu Jul 18 20:01:04 2013
@@ -516,7 +516,8 @@ description = Subversion WC library bind
type = swig_lib
lang = python
path = subversion/bindings/swig/python/libsvn_swig_py
-libs = libsvn_client libsvn_wc libsvn_ra libsvn_delta libsvn_subr apriconv apr
+libs = libsvn_client libsvn_wc libsvn_ra libsvn_delta libsvn_subr
+ apriconv apr python
link-cmd = $(LINK)
install = swig-py-lib
# need special build rule to include -DSWIGPYTHON
@@ -528,7 +529,7 @@ msvc-static = no
type = swig_lib
lang = perl
path = subversion/bindings/swig/perl/libsvn_swig_perl
-libs = libsvn_delta libsvn_subr apriconv apr
+libs = libsvn_delta libsvn_subr apriconv apr perl
install = swig-pl-lib
# need special build rule to include
compile-cmd = $(COMPILE_SWIG_PL)
@@ -539,7 +540,7 @@ msvc-static = yes
type = swig_lib
lang = ruby
path = subversion/bindings/swig/ruby/libsvn_swig_ruby
-libs = libsvn_client libsvn_wc libsvn_delta libsvn_subr apriconv apr
+libs = libsvn_client libsvn_wc libsvn_delta libsvn_subr apriconv apr ruby
link-cmd = $(LINK) $(SWIG_RB_LIBS)
install = swig-rb-lib
# need special build rule to include
@@ -1249,6 +1250,18 @@ external-lib = $(SVN_SQLITE_LIBS)
type = lib
external-lib = $(SVN_XML_LIBS)
+[perl]
+type = lib
+external-lib = $(SVN_PERL_LIBS)
+
+[python]
+type = lib
+external-lib = $(SVN_PYTHON_LIBS)
+
+[ruby]
+type = lib
+external-lib = $(SVN_RUBY_LIBS)
+
[ra-libs]
type = lib
external-lib = $(SVN_RA_LIB_LINK)
Modified: subversion/trunk/build/generator/gen_win.py
URL: http://svn.apache.org/viewvc/subversion/trunk/build/generator/gen_win.py?rev=1504625&r1=1504624&r2=1504625&view=diff
==============================================================================
--- subversion/trunk/build/generator/gen_win.py (original)
+++ subversion/trunk/build/generator/gen_win.py Thu Jul 18 20:01:04 2013
@@ -197,12 +197,14 @@ class WinGeneratorBase(gen_win_dependenc
if 'serf' not in self._libraries or not self._libraries['serf'].is_src:
install_targets = [x for x in install_targets if x.name != 'serf']
- # Drop the swig targets if we don't have swig
- if not self.swig_path and not self.swig_libdir:
- install_targets = [x for x in install_targets
- if not (isinstance(x, gen_base.TargetSWIG)
- or isinstance(x, gen_base.TargetSWIGLib)
- or isinstance(x, gen_base.TargetSWIGProject))]
+ # Drop the swig targets if we don't have swig or language support
+ install_targets = [x for x in install_targets
+ if (not (isinstance(x, gen_base.TargetSWIG)
+ or isinstance(x, gen_base.TargetSWIGLib)
+ or isinstance(x, gen_base.TargetSWIGProject))
+ or (x.lang in self._libraries
+ and self.swig_path
+ and self.swig_libdir))]
# Drop the Java targets if we don't have a JDK
if not self.jdk_path:
@@ -670,16 +672,21 @@ class WinGeneratorBase(gen_win_dependenc
elif is_static:
self.get_linked_win_depends(dep, deps, 1)
+ # and recurse over the external library dependencies for swig libraries,
+ # to include the language runtime
+ elif isinstance(dep, gen_base.TargetSWIGLib):
+ self.get_externallib_depends(dep, deps)
+
def get_externallib_depends(self, target, deps):
"""Find externallib dependencies for a project"""
-
+
direct_deps = self.get_direct_depends(target)
for dep, dep_kind in direct_deps:
self.get_externallib_depends(dep, deps)
-
+
if isinstance(target, gen_base.TargetLinked) and dep.external_lib:
deps[dep] = dep_kind
-
+
def get_win_defines(self, target, cfg):
"Return the list of defines for target"
@@ -688,6 +695,11 @@ class WinGeneratorBase(gen_win_dependenc
"_CRT_NONSTDC_NO_DEPRECATE=",
"_CRT_SECURE_NO_WARNINGS="]
+ if cfg == 'Debug':
+ fakedefines.extend(["_DEBUG","SVN_DEBUG"])
+ elif cfg == 'Release':
+ fakedefines.append("NDEBUG")
+
if self.sqlite_inline:
fakedefines.append("SVN_SQLITE_INLINE")
@@ -701,15 +713,13 @@ class WinGeneratorBase(gen_win_dependenc
if isinstance(target, gen_base.TargetSWIG):
fakedefines.append("SWIG_GLOBAL")
- # Expect rb_errinfo() to be avilable in Ruby 1.9+,
+ # Expect rb_errinfo() to be available in Ruby 1.9+,
# rather than ruby_errinfo.
- if (self.ruby_major_version > 1 or self.ruby_minor_version > 8):
- fakedefines.extend(["HAVE_RB_ERRINFO"])
+ if isinstance(target, gen_base.TargetSWIGLib) and target.lang == 'ruby':
+ ver = self._libraries['ruby'].version.split('.')
- if cfg == 'Debug':
- fakedefines.extend(["_DEBUG","SVN_DEBUG"])
- elif cfg == 'Release':
- fakedefines.append("NDEBUG")
+ if (ver > (1, 8, 0)):
+ fakedefines.extend(["HAVE_RB_ERRINFO"])
if self.static_apr:
fakedefines.extend(["APR_DECLARE_STATIC", "APU_DECLARE_STATIC"])
@@ -781,21 +791,15 @@ class WinGeneratorBase(gen_win_dependenc
# Projects aren't generated unless we have swig
assert self.swig_libdir
- fakeincludes.append(self.apath(self.swig_libdir, target.lang))
-
- if target.lang == "perl":
- if self.swig_vernum >= 103028:
- # At least swigwin 1.3.38+ uses perl5 as directory name. Just add it
- # to the list to make sure we don't break old versions
- fakeincludes.append(self.apath(self.swig_libdir, 'perl5'))
- fakeincludes.extend(self.perl_includes)
- elif target.lang == "python":
- fakeincludes.extend(self.python_includes)
- elif target.lang == "ruby":
- fakeincludes.extend(self.ruby_includes)
+ if target.lang == "perl" and self.swig_vernum >= 103028:
+ # At least swigwin 1.3.38+ uses perl5 as directory name.
+ lang_subdir = 'perl5'
+ else:
+ lang_subdir = target.lang
- # And after the language specific includes, include the generic libdir,
+ # After the language specific includes include the generic libdir,
# to allow overriding a generic with a per language include
+ fakeincludes.append(self.apath(self.swig_libdir, lang_subdir))
fakeincludes.append(self.swig_libdir)
if self.sqlite_inline:
@@ -844,15 +848,6 @@ class WinGeneratorBase(gen_win_dependenc
if target.name == 'mod_dav_svn':
fakelibdirs.append(self.apath(self.httpd_path, "modules/dav/main",
cfg))
- if self.swig_libdir \
- and (isinstance(target, gen_base.TargetSWIG)
- or isinstance(target, gen_base.TargetSWIGLib)):
- if target.lang == "perl" and self.perl_libdir:
- fakelibdirs.append(self.perl_libdir)
- if target.lang == "python" and self.python_libdir:
- fakelibdirs.append(self.python_libdir)
- if target.lang == "ruby" and self.ruby_libdir:
- fakelibdirs.append(self.ruby_libdir)
return gen_base.unique(fakelibdirs)
@@ -876,16 +871,6 @@ class WinGeneratorBase(gen_win_dependenc
if isinstance(target, gen_base.TargetExe):
nondeplibs.append('setargv.obj')
- if ((isinstance(target, gen_base.TargetSWIG)
- or isinstance(target, gen_base.TargetSWIGLib))
- and target.lang == 'perl'):
- nondeplibs.append(self.perl_lib)
-
- if ((isinstance(target, gen_base.TargetSWIG)
- or isinstance(target, gen_base.TargetSWIGLib))
- and target.lang == 'ruby'):
- nondeplibs.append(self.ruby_lib)
-
for dep in self.get_win_depends(target, FILTER_LIBS):
nondeplibs.extend(dep.msvc_libs)
@@ -917,7 +902,10 @@ class WinGeneratorBase(gen_win_dependenc
elif external_lib in ['db',
'intl',
'serf',
- 'sasl']:
+ 'sasl',
+ 'perl',
+ 'python',
+ 'ruby']:
lib = None # Suppress warnings for optional library
else:
Modified: subversion/trunk/build/generator/gen_win_dependencies.py
URL: http://svn.apache.org/viewvc/subversion/trunk/build/generator/gen_win_dependencies.py?rev=1504625&r1=1504624&r2=1504625&view=diff
==============================================================================
--- subversion/trunk/build/generator/gen_win_dependencies.py (original)
+++ subversion/trunk/build/generator/gen_win_dependencies.py Thu Jul 18 20:01:04 2013
@@ -262,17 +262,12 @@ class GenDependenciesBase(gen_base.Gener
self._find_sasl(show_warnings)
self._find_libintl(show_warnings)
- if show_warnings:
- # Find the right Ruby include and libraries dirs and
- # library name to link SWIG bindings with
- self._find_ruby()
-
- # Find the right Perl library name to link SWIG bindings with
- self._find_perl()
-
- # Find the right Python include and libraries dirs for SWIG bindings
- self._find_python()
+ # Swig (optional) dependencies
+ self._find_perl(show_warnings)
+ self._find_python(show_warnings)
+ self._find_ruby(show_warnings)
+ if show_warnings:
# Find the installed SWIG version to adjust swig options
self._find_swig()
@@ -694,86 +689,80 @@ class GenDependenciesBase(gen_base.Gener
dll_name='libeay32.dll',
dll_dir=bin_dir)
- def _find_perl(self):
+ def _find_perl(self, show_warnings):
"Find the right perl library name to link swig bindings with"
- self.perl_includes = []
- self.perl_libdir = None
+
fp = os.popen('perl -MConfig -e ' + escape_shell_arg(
- 'print "$Config{PERL_REVISION}$Config{PERL_VERSION}"'), 'r')
+ 'print "$Config{PERL_REVISION}.$Config{PERL_VERSION}\\n"; '
+ 'print "$Config{archlib}\\n"'), 'r')
try:
line = fp.readline()
if line:
- msg = 'Found installed perl version number.'
- self.perl_lib = 'perl' + line.rstrip() + '.lib'
+ perl_version = line.strip()
+ perl_lib = 'perl%s.lib' % (perl_version.replace('.',''),)
else:
- msg = 'Could not detect perl version.'
- self.perl_lib = 'perl56.lib'
- print('%s\n Perl bindings will be linked with %s\n'
- % (msg, self.perl_lib))
- finally:
- fp.close()
+ return
- fp = os.popen('perl -MConfig -e ' + escape_shell_arg(
- 'print $Config{archlib}'), 'r')
- try:
line = fp.readline()
if line:
- self.perl_libdir = os.path.join(line, 'CORE')
- self.perl_includes = [os.path.join(line, 'CORE')]
+ lib_dir = os.path.join(line.strip(), 'CORE')
+ inc_dir = lib_dir
finally:
fp.close()
- def _find_ruby(self):
+ self._libraries['perl'] = SVNCommonLibrary('perl', inc_dir, lib_dir,
+ perl_lib, perl_version)
+
+ def _find_ruby(self, show_warnings):
"Find the right Ruby library name to link swig bindings with"
- self.ruby_includes = []
- self.ruby_libdir = None
- self.ruby_version = None
- self.ruby_major_version = None
- self.ruby_minor_version = None
+
+ lib_dir = None
+
# Pass -W0 to stifle the "-e:1: Use RbConfig instead of obsolete
# and deprecated Config." warning if we are using Ruby 1.9.
- proc = os.popen('ruby -rrbconfig -W0 -e ' + escape_shell_arg(
- "puts Config::CONFIG['ruby_version'];"
- "puts Config::CONFIG['LIBRUBY'];"
- "puts Config::CONFIG['archdir'];"
- "puts Config::CONFIG['libdir'];"), 'r')
+ fp = os.popen('ruby -rrbconfig -W0 -e ' + escape_shell_arg(
+ "puts Config::CONFIG['ruby_version'];"
+ "puts Config::CONFIG['LIBRUBY'];"
+ "puts Config::CONFIG['archdir'];"
+ "puts Config::CONFIG['libdir'];"), 'r')
try:
- rubyver = proc.readline()[:-1]
- if rubyver:
- self.ruby_version = rubyver
- self.ruby_major_version = string.atoi(self.ruby_version[0])
- self.ruby_minor_version = string.atoi(self.ruby_version[2])
- libruby = proc.readline()[:-1]
- if libruby:
- msg = 'Found installed ruby %s' % rubyver
- self.ruby_lib = libruby
- self.ruby_includes.append(proc.readline()[:-1])
- self.ruby_libdir = proc.readline()[:-1]
- else:
- msg = 'Could not detect Ruby version, assuming 1.8.'
- self.ruby_version = "1.8"
- self.ruby_major_version = 1
- self.ruby_minor_version = 8
- self.ruby_lib = 'msvcrt-ruby18.lib'
- print('%s\n Ruby bindings will be linked with %s\n'
- % (msg, self.ruby_lib))
+ line = fp.readline()
+ if line:
+ ruby_version = line.strip()
+
+ line = fp.readline()
+ if line:
+ ruby_lib = line.strip()
+
+ line = fp.readline()
+ if line:
+ inc_dir = line.strip()
+
+ line = fp.readline()
+ if line:
+ lib_dir = line.strip()
finally:
- proc.close()
+ fp.close()
- def _find_python(self):
+ if not lib_dir:
+ return
+
+ self._libraries['ruby'] = SVNCommonLibrary('ruby', inc_dir, lib_dir,
+ ruby_lib, ruby_version)
+
+ def _find_python(self, show_warnings):
"Find the appropriate options for creating SWIG-based Python modules"
- self.python_includes = []
- self.python_libdir = ""
+
try:
from distutils import sysconfig
- inc = sysconfig.get_python_inc()
- plat = sysconfig.get_python_inc(plat_specific=1)
- self.python_includes.append(inc)
- if inc != plat:
- self.python_includes.append(plat)
- self.python_libdir = self.apath(sysconfig.PREFIX, "libs")
+
+ inc_dir = sysconfig.get_python_inc()
+ lib_dir = self.apath(sysconfig.PREFIX, "libs")
except ImportError:
- pass
+ return
+
+ self._libraries['python'] = SVNCommonLibrary('python', inc_dir, lib_dir, None,
+ sys.version.split(' ')[0])
def _find_jdk(self):
if not self.jdk_path:
@@ -941,14 +930,14 @@ class GenDependenciesBase(gen_base.Gener
# Install layout
inc_dir = os.path.join(self.serf_path, 'include/serf-1')
version = self._get_serf_version(inc_dir)
- lib_dir = os.path.join(inc_dir, 'lib')
+ lib_dir = os.path.join(self.serf_path, 'lib')
debug_lib_dir = None
is_src = False
elif os.path.isfile(os.path.join(self.serf_path, 'include/serf-2/serf.h')):
# Install layout
inc_dir = os.path.join(self.serf_path, 'include/serf-2')
version = self._get_serf_version(inc_dir)
- lib_dir = os.path.join(inc_dir, 'lib')
+ lib_dir = os.path.join(self.serf_path, 'lib')
debug_lib_dir = None
is_src = False
else: