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/20 15:47:27 UTC

svn commit: r1505131 - in /subversion/trunk/build/generator: gen_win.py gen_win_dependencies.py

Author: rhuijben
Date: Sat Jul 20 13:47:27 2013
New Revision: 1505131

URL: http://svn.apache.org/r1505131
Log:
Extend the dependency handling in the Windows project generator by allowing
dependencies to define multiple defines and include directories.

The defines allow major code cleanup and the multiple include directories
will be necessary to switch the jdk/javahl detection.

* build/generator/gen_win.py
  (get_win_defines): Include defines from external dependencies. Remove all
    custom defines that should be handled by the dependencies.
  (get_win_includes):  Handle multiple includes. Handle the path normalization
    in one place instead of everywhere except a few others.
  (get_win_lib_dirs): Remove sqlite_inline reference.

* build/generator/gen_win_dependencies.py
  (SVNCommonLibrary): Support multiple include directories and defines.
  (_find_apr,
   _find_apr_util_and_expat): Handle defines for static apr.
  (_find_bdb): Publish that we have BDB.
  (_find_ruby): Provide ruby define.
  (_find_serf): Provide serf defines.
  (_find_sasl): Publish that we have sasl.
  (_find_sqlite): Handle inline define for amalgamation support.

Modified:
    subversion/trunk/build/generator/gen_win.py
    subversion/trunk/build/generator/gen_win_dependencies.py

Modified: subversion/trunk/build/generator/gen_win.py
URL: http://svn.apache.org/viewvc/subversion/trunk/build/generator/gen_win.py?rev=1505131&r1=1505130&r2=1505131&view=diff
==============================================================================
--- subversion/trunk/build/generator/gen_win.py (original)
+++ subversion/trunk/build/generator/gen_win.py Sat Jul 20 13:47:27 2013
@@ -720,62 +720,39 @@ class WinGeneratorBase(gen_win_dependenc
     elif cfg == 'Release':
       fakedefines.append("NDEBUG")
 
-    if self.sqlite_inline:
-      fakedefines.append("SVN_SQLITE_INLINE")
-
     if isinstance(target, gen_base.TargetApacheMod):
       if target.name == 'mod_dav_svn':
         fakedefines.extend(["AP_DECLARE_EXPORT"])
 
-    if target.name.find('ruby') == -1:
-      fakedefines.append("snprintf=_snprintf")
-
     if isinstance(target, gen_base.TargetSWIG):
       fakedefines.append("SWIG_GLOBAL")
 
-    # Expect rb_errinfo() to be available in Ruby 1.9+,
-    # rather than ruby_errinfo.
-    if isinstance(target, gen_base.TargetSWIGLib) and target.lang == 'ruby':
-      ver = self._libraries['ruby'].version.split('.')
-      ver = tuple(map(int, ver))
-      if ver > (1, 8, 0):
-        fakedefines.extend(["HAVE_RB_ERRINFO"])
-
-    if self.static_apr:
-      fakedefines.extend(["APR_DECLARE_STATIC", "APU_DECLARE_STATIC"])
-
-    # XXX: Check if db is present, and if so, let apr-util know
-    # XXX: This is a hack until the apr build system is improved to
-    # XXX: know these things for itself.
-    if 'db' in self._libraries:
-      fakedefines.append("APU_HAVE_DB=1")
-      fakedefines.append("SVN_LIBSVN_FS_LINKS_FS_BASE=1")
+    for dep in self.get_win_depends(target, FILTER_EXTERNALLIBS):
+      if dep.external_lib:
+        for elib in re.findall('\$\(SVN_([^\)]*)_LIBS\)', dep.external_lib):
+          external_lib = elib.lower()
+
+        if external_lib in self._libraries:
+          lib = self._libraries[external_lib]
+
+          if lib.defines:
+            fakedefines.extend(lib.defines)
 
     # check if they wanted nls
     if self.enable_nls:
       fakedefines.append("ENABLE_NLS")
 
-    if 'serf' in self._libraries:
-      fakedefines.append("SVN_HAVE_SERF")
-      fakedefines.append("SVN_LIBSVN_CLIENT_LINKS_RA_SERF")
-
     # check we have sasl
-    if 'sasl' in self._libraries:
-      fakedefines.append("SVN_HAVE_SASL")
-
     if target.name.endswith('svn_subr'):
       fakedefines.append("SVN_USE_WIN32_CRASHHANDLER")
 
-    # use static linking to Expat
-    fakedefines.append("XML_STATIC")
-
     return fakedefines
 
   def get_win_includes(self, target):
     "Return the list of include directories for target"
 
-    fakeincludes = [ self.apath("subversion/include"),
-                     self.apath("subversion") ]
+    fakeincludes = [ "subversion/include",
+                     "subversion" ]
                      
     for dep in self.get_win_depends(target, FILTER_EXTERNALLIBS):
       if dep.external_lib:
@@ -785,23 +762,24 @@ class WinGeneratorBase(gen_win_dependenc
         if external_lib in self._libraries:
           lib = self._libraries[external_lib]
 
-          fakeincludes.append(self.apath(lib.include_dir))
+          fakeincludes.extend(lib.include_dirs)
 
     if target.name == 'mod_authz_svn':
-      fakeincludes.extend([ self.apath(self.httpd_path, "modules/aaa") ])
+      fakeincludes.extend([ os.path.join(self.httpd_path, "modules/aaa") ])
 
     if isinstance(target, gen_base.TargetApacheMod):
-      fakeincludes.extend([ self.apath(self.httpd_path, "include") ])
+      fakeincludes.extend([ os.path.join(self.httpd_path, "include") ])
     elif isinstance(target, gen_base.TargetSWIG):
       util_includes = "subversion/bindings/swig/%s/libsvn_swig_%s" \
                       % (target.lang,
                          gen_base.lang_utillib_suffix[target.lang])
-      fakeincludes.extend([ self.path("subversion/bindings/swig"),
-                            self.path("subversion/bindings/swig/proxy"),
-                            self.path("subversion/bindings/swig/include"),
-                            self.path(util_includes) ])
+      fakeincludes.extend([ "subversion/bindings/swig",
+                            "subversion/bindings/swig/proxy",
+                            "subversion/bindings/swig/include",
+                            util_includes
+                          ])
     else:
-      fakeincludes.extend([ self.path("subversion/bindings/swig/proxy") ])
+      fakeincludes.extend(["subversion/bindings/swig/proxy"])
 
     if (isinstance(target, gen_base.TargetSWIG)
         or isinstance(target, gen_base.TargetSWIGLib)):
@@ -817,7 +795,7 @@ class WinGeneratorBase(gen_win_dependenc
 
       # 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(os.path.join(self.swig_libdir, lang_subdir))
       fakeincludes.append(self.swig_libdir)
 
     if target.name == "libsvnjavahl" and self.jdk_path:
@@ -827,7 +805,7 @@ class WinGeneratorBase(gen_win_dependenc
     if target.name.find('cxxhl') != -1:
       fakeincludes.append(self.path("subversion/bindings/cxxhl/include"))
 
-    return gen_base.unique(fakeincludes)
+    return gen_base.unique(map(self.apath, fakeincludes))
 
   def get_win_lib_dirs(self, target, cfg):
     "Return the list of library directories for target"
@@ -853,9 +831,6 @@ class WinGeneratorBase(gen_win_dependenc
       
           fakelibdirs.append(lib_dir)
 
-    if not self.sqlite_inline:
-      fakelibdirs.append(self.apath(self.sqlite_path, "lib"))
-
     if isinstance(target, gen_base.TargetApacheMod):
       fakelibdirs.append(self.apath(self.httpd_path, cfg))
       if target.name == 'mod_dav_svn':

Modified: subversion/trunk/build/generator/gen_win_dependencies.py
URL: http://svn.apache.org/viewvc/subversion/trunk/build/generator/gen_win_dependencies.py?rev=1505131&r1=1505130&r2=1505131&view=diff
==============================================================================
--- subversion/trunk/build/generator/gen_win_dependencies.py (original)
+++ subversion/trunk/build/generator/gen_win_dependencies.py Sat Jul 20 13:47:27 2013
@@ -52,12 +52,17 @@ import ezt
 
 class SVNCommonLibrary:
 
-  def __init__(self, name, include_dir, lib_dir, lib_name, version=None,
+  def __init__(self, name, include_dirs, lib_dir, lib_name, version=None,
                debug_lib_dir=None, debug_lib_name=None, dll_dir=None,
                dll_name=None, debug_dll_dir=None, debug_dll_name=None,
-               is_src=False):
+               is_src=False, defines=[]):
     self.name = name
-    self.include_dir = include_dir
+    if include_dirs:
+      self.include_dirs = include_dirs if isinstance(include_dirs, list) \
+                                       else [include_dirs]
+    else:
+      self.include_dirs = []
+    self.defines = defines if not defines or isinstance(defines, list) else [defines]
     self.lib_dir = lib_dir
     self.lib_name = lib_name
     self.version = version
@@ -336,12 +341,14 @@ class GenDependenciesBase(gen_base.Gener
     if major > 0:
         suffix = '-%d' % major
 
+    defines = []
     if self.static_apr:
       lib_name = 'apr%s.lib' % suffix
       lib_dir = os.path.join(self.apr_path, 'LibR')
       dll_dir = None
       debug_dll_dir = None
-      
+      defines.extend(["APR_DECLARE_STATIC"])
+
       if not os.path.isdir(lib_dir) and \
          os.path.isfile(os.path.join(self.apr_path, 'lib', lib_name)):
         # Installed APR instead of APR-Source
@@ -374,7 +381,8 @@ class GenDependenciesBase(gen_base.Gener
                                               debug_lib_dir=debug_lib_dir,
                                               dll_dir=dll_dir,
                                               dll_name=dll_name,
-                                              debug_dll_dir=debug_dll_dir)
+                                              debug_dll_dir=debug_dll_dir,
+                                              defines=defines)
 
   def _find_apr_util_and_expat(self):
     "Find the APR-util library and version"
@@ -424,11 +432,13 @@ class GenDependenciesBase(gen_base.Gener
     if major > 0:
         suffix = '-%d' % major
 
+    defines = []
     if self.static_apr:
       lib_name = 'aprutil%s.lib' % suffix
       lib_dir = os.path.join(self.apr_util_path, 'LibR')
       dll_dir = None
       debug_dll_dir = None
+      defines.extend(["APR_DECLARE_STATIC"])
       
       if not os.path.isdir(lib_dir) and \
          os.path.isfile(os.path.join(self.apr_util_path, 'lib', lib_name)):
@@ -463,7 +473,8 @@ class GenDependenciesBase(gen_base.Gener
                                                    debug_lib_dir=debug_lib_dir,
                                                    dll_dir=dll_dir,
                                                    dll_name=dll_name,
-                                                   debug_dll_dir=debug_dll_dir)
+                                                   debug_dll_dir=debug_dll_dir,
+                                                   defines=defines)
 
     # And now find expat
     # If we have apr-util as a source location, it is in a subdir.
@@ -500,7 +511,8 @@ class GenDependenciesBase(gen_base.Gener
 
     self._libraries['xml'] = SVNCommonLibrary('expat', inc_path, lib_dir,
                                                'xml.lib', xml_version,
-                                               debug_lib_dir = debug_lib_dir)
+                                               debug_lib_dir = debug_lib_dir,
+                                               defines=['XML_STATIC'])
 
   def _find_zlib(self):
     "Find the ZLib library and version"
@@ -626,12 +638,17 @@ class GenDependenciesBase(gen_base.Gener
     else:
       debug_dll_name = None
 
+    # Usually apr-util doesn't find BDB on Windows, so we help apr-util
+    # by defining the value ourselves (Legacy behavior)
+    defines = ['APU_HAVE_DB=1', 'SVN_LIBSVN_FS_LINKS_FS_BASE']
+
     self._libraries['db'] = SVNCommonLibrary('db', inc_path, lib_dir, lib_name,
                                               version,
                                               debug_lib_name=debug_lib_name,
                                               dll_dir=dll_dir,
                                               dll_name=dll_name,
-                                              debug_dll_name=debug_dll_name)
+                                              debug_dll_name=debug_dll_name,
+                                              defines=defines)
 
     # For compatibility with old code
     self.bdb_lib = self._libraries['db'].lib_name
@@ -752,8 +769,18 @@ class GenDependenciesBase(gen_base.Gener
     if not lib_dir:
       return
 
+    # Visual C++ doesn't have a standard compliant snprintf yet
+    # (Will probably be added in VS2013 + 1)
+    defines = ['snprintf=_snprintf']
+
+    ver = ruby_version.split('.')
+    ver = tuple(map(int, ver))
+    if ver > (1, 8, 0):
+      defines.extend(["HAVE_RB_ERRINFO"])
+
     self._libraries['ruby'] = SVNCommonLibrary('ruby', inc_dir, lib_dir,
-                                               ruby_lib, ruby_version)
+                                               ruby_lib, ruby_version,
+                                               defines=defines)
 
   def _find_python(self, show_warnings):
     "Find the appropriate options for creating SWIG-based Python modules"
@@ -969,10 +996,13 @@ class GenDependenciesBase(gen_base.Gener
     else:
       lib_name = 'serf.lib'
 
+    defines = ['SVN_HAVE_SERF', 'SVN_LIBSVN_CLIENT_LINKS_RA_SERF']
+
     self._libraries['serf'] = SVNCommonLibrary('serf', inc_dir, lib_dir,
                                                 lib_name, serf_version,
                                                 debug_lib_dir=debug_lib_dir,
-                                                is_src=is_src)
+                                                is_src=is_src,
+                                                defines=defines)
 
   def _find_sasl(self, show_warning):
     "Check if sals is available"
@@ -1027,7 +1057,8 @@ class GenDependenciesBase(gen_base.Gener
     self._libraries['sasl'] = SVNCommonLibrary('sasl', inc_dir, lib_dir,
                                                'libsasl.lib', sasl_version,
                                                dll_dir=dll_dir,
-                                               dll_name=dll_name)
+                                               dll_name=dll_name,
+                                               defines=['SVN_HAVE_SASL'])
 
   def _find_libintl(self, show_warning):
     "Find gettext support"
@@ -1097,7 +1128,8 @@ class GenDependenciesBase(gen_base.Gener
     lib_dir = None
     dll_dir = None
     dll_name = None
-    amalgamation = False
+    defines = []
+
     lib_name = 'sqlite3.lib'
 
     if os.path.isfile(os.path.join(sqlite_base, 'include/sqlite3.h')):
@@ -1124,7 +1156,7 @@ class GenDependenciesBase(gen_base.Gener
       inc_dir = sqlite_base
       lib_dir = None
       lib_name = None 
-      amalgamation = True
+      defines.append('SVN_SQLITE_INLINE')
     else:
       sys.stderr.write("ERROR: SQLite not found\n" % self.sqlite_path)
       sys.stderr.write("Use '--with-sqlite' option to configure sqlite location.\n");
@@ -1153,11 +1185,11 @@ class GenDependenciesBase(gen_base.Gener
                           sqlite_version))
       sys.exit(1)
 
-    self.sqlite_inline = amalgamation
     self._libraries['sqlite'] = SVNCommonLibrary('sqlite', inc_dir, lib_dir,
                                                  lib_name, sqlite_version,
                                                  dll_dir=dll_dir,
-                                                 dll_name=dll_name)
+                                                 dll_name=dll_name,
+                                                 defines=defines)
 
 # ============================================================================
 # This is a cut-down and modified version of code from: