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: