Author: rinrab
Date: Tue Jun  2 13:17:43 2026
New Revision: 1934881

Log:
Generate pkgconfig modules with the cmake build.

* CMakeLists.txt
  (SVN_APR_MAJOR_VERSION, SVN_ZLIB_LIBS SVN_XML_LIBS SVN_LZ4_LIBS
   SVN_UTF8PROC_LIBS SVN_NCURSES_LIBS): Set those vars throughout configuration
   and dependency search.
  (#pkgconfig): Loop through all .pc files and configure them.
* build/generator/gen_cmake.py
  (#imports): Add gen_pkgconfig.py.
  (write): Call write_pkg_config_dot_in_files().
* build/generator/gen_make.py
  (#imports): Add gen_pkgconfig.py.
  (write): Call write_pkg_config_dot_in_files().
  (write_pkg_config_dot_in_files): Factored-out into gen_pkgconfig.py
* build/generator/gen_pkgconfig.py: New file from an svn-copy of gen_make.py
  (write_pkg_config_dot_in_files): Only keeping this function.

Added:
   subversion/trunk/build/generator/gen_pkgconfig.py
      - copied, changed from r1934845, 
subversion/trunk/build/generator/gen_make.py
Modified:
   subversion/trunk/CMakeLists.txt
   subversion/trunk/build/generator/gen_cmake.py
   subversion/trunk/build/generator/gen_make.py

Modified: subversion/trunk/CMakeLists.txt
==============================================================================
--- subversion/trunk/CMakeLists.txt     Tue Jun  2 13:09:09 2026        
(r1934880)
+++ subversion/trunk/CMakeLists.txt     Tue Jun  2 13:17:43 2026        
(r1934881)
@@ -486,9 +486,11 @@ if(SVN_USE_PKG_CONFIG)
     # apr-1
     pkg_check_modules(aprutil-1 REQUIRED IMPORTED_TARGET apr-util-1)
     add_library(external-aprutil ALIAS PkgConfig::aprutil-1)
+    set(SVN_APR_MAJOR_VERSION 1)
   else()
     # apr-2
     add_library(external-aprutil ALIAS PkgConfig::apr)
+    set(SVN_APR_MAJOR_VERSION 2)
   endif()
 else()
   find_package(APR REQUIRED)
@@ -507,6 +509,7 @@ endif()
 if(SVN_USE_PKG_CONFIG)
   pkg_check_modules(zlib REQUIRED IMPORTED_TARGET zlib)
   add_library(external-zlib ALIAS PkgConfig::zlib)
+  set(SVN_ZLIB_LIBS ${zlib_LDFLAGS})
 else()
   find_package(ZLIB REQUIRED)
   add_library(external-zlib ALIAS ZLIB::ZLIB)
@@ -517,6 +520,7 @@ endif()
 if(SVN_USE_PKG_CONFIG)
   pkg_check_modules(expat REQUIRED IMPORTED_TARGET expat)
   add_library(external-xml ALIAS PkgConfig::expat)
+  set(SVN_XML_LIBS ${expat_LDFLAGS})
 else()
   find_package(EXPAT REQUIRED)
   add_library(external-xml ALIAS EXPAT::EXPAT)
@@ -535,6 +539,7 @@ if(SVN_USE_INTERNAL_LZ4)
 elseif(SVN_USE_PKG_CONFIG)
   pkg_check_modules(lz4 REQUIRED IMPORTED_TARGET liblz4)
   add_library(external-lz4 ALIAS PkgConfig::lz4)
+  set(SVN_LZ4_LIBS ${lz4_LDFLAGS})
 else()
   find_package(lz4 CONFIG REQUIRED)
   add_library(external-lz4 ALIAS lz4::lz4)
@@ -553,6 +558,7 @@ if(SVN_USE_INTERNAL_UTF8PROC)
 elseif(SVN_USE_PKG_CONFIG)
   pkg_check_modules(utf8proc REQUIRED IMPORTED_TARGET libutf8proc)
   add_library(external-utf8proc ALIAS PkgConfig::utf8proc)
+  set(SVN_UTF8PROC_LIBS ${utf8proc_LDFLAGS})
 else()
   find_package(UTF8PROC REQUIRED)
   add_library(external-utf8proc ALIAS UTF8PROC::UTF8PROC)
@@ -715,6 +721,7 @@ if (SVN_ENABLE_TUI)
   if(SVN_USE_PKG_CONFIG)
     pkg_check_modules(ncurses REQUIRED IMPORTED_TARGET ncurses)
     target_link_libraries(external-ncurses INTERFACE PkgConfig::ncurses)
+    set(SVN_NCURSES_LIBS ncurses)
   else()
     find_package(CURSES REQUIRED)
     target_link_libraries(external-ncurses INTERFACE CURSES::CURSES)
@@ -998,6 +1005,40 @@ if(SVN_ENABLE_TESTS)
   endif()
 endif()
 
+if (SVN_USE_PKG_CONFIG)
+  file(GLOB pc_files "${CMAKE_CURRENT_SOURCE_DIR}/subversion/libsvn_*/*.pc.in")
+
+  # setup template variables
+  set(PACKAGE_VERSION ${SVN_VERSION})
+  set(prefix "${CMAKE_INSTALL_PREFIX}")
+  set(exec_prefix "\${prefix}")
+  set(libdir "\${exec_prefix}/lib")
+  set(includedir "\${prefix}/include")
+
+  foreach (input_file ${pc_files})
+    get_filename_component(name ${input_file} NAME_WLE)
+    set(output_file "${CMAKE_CURRENT_BINARY_DIR}/${name}")
+
+    # @ONLY to remove ${variable} syntax that overlaps with pkg-config
+    # variables
+    configure_file(${input_file} ${output_file} @ONLY)
+
+    install(
+      FILES ${output_file}
+      DESTINATION "lib/pkgconfig"
+    )
+
+    unset(output_file)
+    unset(name)
+  endforeach()
+
+  unset(PACKAGE_VERSION)
+  unset(prefix)
+  unset(exec_prefix)
+  unset(libdir)
+  unset(includedir)
+endif()
+
 if (SVN_ENABLE_SVNXX)
   target_include_directories(libsvnxx PUBLIC
     "${CMAKE_CURRENT_SOURCE_DIR}/subversion/bindings/cxx/include"

Modified: subversion/trunk/build/generator/gen_cmake.py
==============================================================================
--- subversion/trunk/build/generator/gen_cmake.py       Tue Jun  2 13:09:09 
2026        (r1934880)
+++ subversion/trunk/build/generator/gen_cmake.py       Tue Jun  2 13:17:43 
2026        (r1934881)
@@ -23,6 +23,7 @@ import os
 import sys
 import ezt
 import gen_base
+from gen_pkgconfig import write_pkg_config_dot_in_files 
 
 class _eztdata(object):
   def __init__(self, **kw):
@@ -255,6 +256,9 @@ class Generator(gen_base.GeneratorBase):
                                      'targets.cmake.ezt'))
     template.generate(output_file, data)
 
+    write_pkg_config_dot_in_files(self.version, self.sections,
+                                  self.get_install_sources())
+
   def get_install_sources(self):
     install_sources = self.graph.get_all_sources(gen_base.DT_INSTALL)
     result = []

Modified: subversion/trunk/build/generator/gen_make.py
==============================================================================
--- subversion/trunk/build/generator/gen_make.py        Tue Jun  2 13:09:09 
2026        (r1934880)
+++ subversion/trunk/build/generator/gen_make.py        Tue Jun  2 13:17:43 
2026        (r1934881)
@@ -48,6 +48,7 @@ import gen_base
 import generator.swig.header_wrappers
 import generator.swig.checkout_swig_header
 import generator.swig.external_runtime
+from gen_pkgconfig import write_pkg_config_dot_in_files 
 
 from gen_base import build_path_join, build_path_strip, build_path_splitfile, \
       build_path_basename, build_path_dirname, build_path_retreat, unique
@@ -497,7 +498,7 @@ class Generator(gen_base.GeneratorBase):
 
     self.write_transform_libtool_scripts(install_sources)
 
-    self.write_pkg_config_dot_in_files(install_sources)
+    write_pkg_config_dot_in_files(self.version, self.sections, install_sources)
 
   def write_standalone(self):
     """Write autogen-standalone.mk"""
@@ -613,63 +614,6 @@ DIR=`pwd`
       libdep_cache[target_name] = sorted(libs)
     return libdep_cache[target_name]
 
-  def write_pkg_config_dot_in_files(self, install_sources):
-    """Write pkg-config .pc.in files for Subversion libraries."""
-    for target_ob in install_sources:
-      if not (isinstance(target_ob, gen_base.TargetLib) and
-              target_ob.path.startswith('subversion/libsvn_')):
-        continue
-
-      lib_name = target_ob.name
-      lib_path = self.sections[lib_name].options.get('path')
-      lib_deps = self.sections[lib_name].options.get('libs')
-      lib_desc = self.sections[lib_name].options.get('description')
-      output_path = build_path_join(lib_path, lib_name + '.pc.in')
-      template = ezt.Template(os.path.join('build', 'generator', 'templates',
-                                           'pkg-config.in.ezt'),
-                              compress_whitespace=False)
-      class _eztdata(object):
-        def __init__(self, **kw):
-          vars(self).update(kw)
-
-      data = _eztdata(
-        lib_name=lib_name,
-        lib_desc=lib_desc,
-        lib_deps=[],
-        lib_required=[],
-        lib_required_private=[],
-        version=self.version,
-        )
-      # libsvn_foo -> -lsvn_foo-1
-      data.lib_deps.append('-l%s-%s' % (lib_name.replace('lib', '', 1), 
data.version))
-      for lib_dep in lib_deps.split():
-        if lib_dep == 'apriconv':
-          # apriconv is part of apr-util, skip it
-          continue
-        external_lib = self.sections[lib_dep].options.get('external-lib')
-        if external_lib:
-          ### Some of Subversion's internal libraries can appear as external
-          ### libs to handle conditional compilation. Skip these for now.
-          if external_lib in ['$(SVN_RA_LIB_LINK)', '$(SVN_FS_LIB_LINK)']:
-            continue
-          # If the external library is known to support pkg-config,
-          # add it to the Required: or Required.private: section.
-          # Otherwise, add the external library to linker flags.
-          pkg_config = self.sections[lib_dep].options.get('pkg-config')
-          if pkg_config:
-            private = self.sections[lib_dep].options.get('pkg-config-private')
-            if private:
-              data.lib_required_private.append(pkg_config)
-            else:
-              data.lib_required.append(pkg_config)
-          else:
-            # $(EXTERNAL_LIB) -> @EXTERNAL_LIB@
-            data.lib_deps.append('@%s@' % external_lib[2:-1])
-        else:
-          data.lib_required_private.append(lib_dep)
-
-      template.generate(open(output_path, 'w'), data)
-
 class UnknownDependency(Exception):
   "We don't know how to deal with the dependent to link it in."
   pass

Copied and modified: subversion/trunk/build/generator/gen_pkgconfig.py (from 
r1934845, subversion/trunk/build/generator/gen_make.py)
==============================================================================
--- subversion/trunk/build/generator/gen_make.py        Mon Jun  1 16:10:02 
2026        (r1934845, copy source)
+++ subversion/trunk/build/generator/gen_pkgconfig.py   Tue Jun  2 13:17:43 
2026        (r1934881)
@@ -1,5 +1,4 @@
 #
-#
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
 # distributed with this work for additional information
@@ -17,661 +16,68 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-#
-#
-# gen_make.py -- generate makefiles and dependencies
+# gen_pkgconfig.py -- writes libname.pc.in files
 #
 
 import os
-import stat
-import sys
-try:
-  # Python >=3.0
-  import configparser
-except ImportError:
-  # Python <3.0
-  import ConfigParser as configparser
-
-if sys.version_info[0] >= 3:
-  # Python >=3.0
-  from io import StringIO
-else:
-  # Python <3.0
-  try:
-    from cStringIO import StringIO
-  except ImportError:
-    from StringIO import StringIO
-
 import ezt
 
-import gen_base
-import generator.swig.header_wrappers
-import generator.swig.checkout_swig_header
-import generator.swig.external_runtime
-
-from gen_base import build_path_join, build_path_strip, build_path_splitfile, \
-      build_path_basename, build_path_dirname, build_path_retreat, unique
-
-
-def _normstr(x):
-  if os.sep == '/':
-    return os.path.normpath(str(x))
-  else:
-    return os.path.normpath(str(x).replace('/', os.sep)).replace(os.sep, '/')
-
-class Generator(gen_base.GeneratorBase):
-
-  _extension_map = {
-    ('exe', 'target'): '$(EXEEXT)',
-    ('exe', 'object'): '.lo',
-    ('lib', 'target'): '.la',
-    ('lib', 'object'): '.lo',
-    ('pyd', 'target'): '.la',
-    ('pyd', 'object'): '.lo',
-    ('so', 'target'): '.la',
-    ('so', 'object'): '.lo',
-    }
-
-  def __init__(self, fname, verfname, options=None):
-    gen_base.GeneratorBase.__init__(self, fname, verfname, options)
-    self.assume_shared_libs = False
-    if ('--assume-shared-libs', '') in options:
-      self.assume_shared_libs = True
-
-  def write(self):
-    install_deps = self.graph.get_deps(gen_base.DT_INSTALL)
-    install_sources = self.graph.get_all_sources(gen_base.DT_INSTALL)
-
-    cp = configparser.ConfigParser()
-    cp.read('gen-make.opts')
-    if cp.has_option('options', '--installed-libs'):
-      self.installed_libs = cp.get('options', '--installed-libs').split(',')
-    else:
-      self.installed_libs = []
-
-    # ensure consistency between runs
-    install_deps.sort()
-    install_sources.sort(key = lambda s: s.name)
+from gen_base import build_path_join, TargetLib
 
+def write_pkg_config_dot_in_files(version, sections, install_sources):
+  """Write pkg-config .pc.in files for Subversion libraries."""
+  for target_ob in install_sources:
+    if not (isinstance(target_ob, TargetLib) and
+            target_ob.path.startswith('subversion/libsvn_')):
+      continue
+
+    lib_name = target_ob.name
+    lib_path = sections[lib_name].options.get('path')
+    lib_deps = sections[lib_name].options.get('libs')
+    lib_desc = sections[lib_name].options.get('description')
+    output_path = build_path_join(lib_path, lib_name + '.pc.in')
+    template = ezt.Template(os.path.join('build', 'generator', 'templates',
+                                         'pkg-config.in.ezt'),
+                            compress_whitespace=False)
     class _eztdata(object):
       def __init__(self, **kw):
         vars(self).update(kw)
 
     data = _eztdata(
-      modules=[ ],
-      swig_langs=[ ],
-      swig_c=[ ],
-      target=[ ],
-      itargets=[ ],
-      areas=[ ],
-      isources=[ ],
-      deps=[ ],
-      sql=[],
+      lib_name=lib_name,
+      lib_desc=lib_desc,
+      lib_deps=[],
+      lib_required=[],
+      lib_required_private=[],
+      version=version,
       )
-
-    ########################################
-
-    for target in install_sources:
-      if isinstance(target, gen_base.TargetRaModule) or \
-         isinstance(target, gen_base.TargetFsModule):
-        # name of the module: strip 'libsvn_' and upper-case it
-        name = target.name[7:].upper()
-
-        # construct a list of the other .la libs to link against
-        retreat = build_path_retreat(target.path)
-        if target.name in self.installed_libs:
-          deps = []
-          link = [ '-l%s-%s' % (target.name[3:], self.version) ]
-        else:
-          deps = [ target.filename ]
-          link = [ build_path_join(retreat, target.filename) ]
-        for source in self.graph.get_sources(gen_base.DT_LINK, target.name):
-          if not isinstance(source, gen_base.TargetLib) or source.external_lib:
-            continue
-          elif source.name in self.installed_libs:
-            continue
-          deps.append(source.filename)
-          link.append(build_path_join(retreat, source.filename))
-
-        data.modules.append(_eztdata(name=name, deps=deps, link=link))
-
-    # write a list of directories in which things are built
-    #   get all the test scripts' directories
-    script_dirs = list(map(build_path_dirname, self.scripts + 
self.bdb_scripts))
-
-    #   remove duplicate directories between targets and tests
-    build_dirs = unique(self.target_dirs + script_dirs + self.swig_dirs)
-    data.build_dirs = build_dirs
-
-    # write lists of test files
-    # deps = all, progs = not including those marked "testing = skip"
-    data.bdb_test_deps = self.bdb_test_deps + self.bdb_scripts
-    data.bdb_test_progs = self.bdb_test_progs + self.bdb_scripts
-    data.test_deps = self.test_deps + self.scripts
-    data.test_progs = self.test_progs + self.scripts
-    data.test_helpers = self.test_helpers
-
-    # write list of all manpages
-    data.manpages = self.manpages
-
-    # write a list of files to remove during "make clean"
-    cfiles = [ ]
-    for target in install_sources:
-      # .la files are handled by the standard 'clean' rule; clean all the
-      # other targets
-      if not isinstance(target, gen_base.TargetScript) \
-         and not isinstance(target, gen_base.TargetProject) \
-         and not isinstance(target, gen_base.TargetI18N) \
-         and not isinstance(target, gen_base.TargetJava) \
-         and not target.external_lib \
-         and target.filename[-3:] != '.la':
-        cfiles.append(target.filename)
-    for script in self.scripts:
-      if script.endswith('.py'):
-        cfiles.append(script + 'c')
-    data.cfiles = sorted(cfiles)
-
-    # here are all the SQL files and their generated headers. the Makefile
-    # has an implicit rule for generating these, so there isn't much to do
-    # except to clean them out. we only do that for 'make extraclean' since
-    # these are included as part of the tarball. the files are transformed
-    # by gen-make, and developers also get a Make rule to keep them updated.
-    for hdrfile, sqlfile in sorted(self.graph.get_deps(gen_base.DT_SQLHDR),
-                                   key=lambda t: t[0]):
-      data.sql.append(_eztdata(header=hdrfile, source=sqlfile[0]))
-
-    data.release_mode = ezt.boolean(self.release_mode)
-
-    ########################################
-
-    if not self.release_mode:
-      swig_rules = StringIO()
-      for swig in (generator.swig.header_wrappers,
-                   generator.swig.checkout_swig_header,
-                   generator.swig.external_runtime):
-        gen = swig.Generator(self.conf, "swig")
-        gen.write_makefile_rules(swig_rules)
-
-      data.swig_rules = swig_rules.getvalue()
-
-    ########################################
-
-    # write dependencies and build rules for generated .c files
-    swig_c_deps = sorted(self.graph.get_deps(gen_base.DT_SWIG_C),
-                         key=lambda t: t[0].filename)
-
-    swig_lang_deps = {}
-    for lang in self.swig.langs:
-      swig_lang_deps[lang] = []
-
-    for objname, sources in swig_c_deps:
-      swig_lang_deps[objname.lang].append(str(objname))
-
-    for lang in self.swig.langs:
-      data.swig_langs.append(_eztdata(name=lang,
-                                      short=self.swig.short[lang],
-                                      
short_upper=self.swig.short[lang].upper(),
-                                      deps=swig_lang_deps[lang]))
-
-    ########################################
-
-    if not self.release_mode:
-      for objname, sources in swig_c_deps:
-        data.swig_c.append(_eztdata(c_file=str(objname),
-                                    deps=list(map(str, sources)),
-                                    opts=self.swig.opts[objname.lang],
-                                    source=str(sources[0])))
-
-    ########################################
-
-    for target_ob in install_sources:
-
-      if isinstance(target_ob, gen_base.TargetScript):
-        # there is nothing to build
-        continue
-
-      target = target_ob.name
-      if isinstance(target_ob, gen_base.TargetJava):
-        path = target_ob.output_dir
-      else:
-        path = target_ob.path
-
-      retreat = build_path_retreat(path)
-
-      # get the source items (.o and .la) for the link unit
-      objects = [ ]
-      objdeps = [ ]
-      object_srcs = [ ]
-      headers = [ ]
-      header_classes = [ ]
-      header_class_filenames = [ ]
-      deps = [ ]
-      libs = [ ]
-      add_deps = target_ob.add_deps.split()
-
-      for link_dep in self.graph.get_sources(gen_base.DT_LINK, target_ob.name):
-        if isinstance(link_dep, gen_base.TargetJava):
-          deps.append(link_dep.name)
-        elif isinstance(link_dep, gen_base.TargetLinked):
-          if link_dep.external_lib:
-            libs.append(link_dep.external_lib)
-          elif link_dep.external_project:
-            # FIXME: This is a temporary workaround to fix build breakage
-            # expeditiously.  It is of questionable validity for a build
-            # node to have external_project but not have external_lib.
-            pass
-          elif link_dep.name in self.installed_libs:
-            libs.append('-l%s-%s' % (link_dep.name[3:], self.version))
-          else:
-            # append the output of the target to our stated dependencies
-            if not self.assume_shared_libs:
-              deps.append(link_dep.filename)
-
-            # link against the library
-            libs.append(build_path_join(retreat, link_dep.filename))
-        elif isinstance(link_dep, gen_base.ObjectFile):
-          # link in the object file
-          objects.append(link_dep.filename)
-          objdeps.append(_normstr(link_dep.filename))
-          for dep in self.graph.get_sources(gen_base.DT_OBJECT, link_dep, 
gen_base.SourceFile):
-            object_srcs.append(
-              build_path_join('$(abs_srcdir)', dep.filename))
-        elif isinstance(link_dep, gen_base.HeaderFile):
-          # link in the header file
-          # N.B. that filename_win contains the '_'-escaped class name
-          headers.append(link_dep.filename_win)
-          header_classes.append(link_dep.classname)
-          for dep in self.graph.get_sources(gen_base.DT_OBJECT, link_dep, 
gen_base.ObjectFile):
-            header_class_filenames.append(dep.filename)
-        else:
-          ### we don't know what this is, so we don't know what to do with it
-          raise UnknownDependency
-
-      for nonlib in self.graph.get_sources(gen_base.DT_NONLIB, target_ob.name):
-        if isinstance(nonlib, gen_base.TargetLinked):
-          if not nonlib.external_lib:
-            deps.append(nonlib.filename)
-
-      targ_varname = target.replace('-', '_')
-      objnames = build_path_strip(path, objects)
-
-      ezt_target = _eztdata(name=target_ob.name,
-                            varname=targ_varname,
-                            path=path,
-                            install=None,
-                            add_deps=add_deps,
-                            objects=objects,
-                            objdeps=objdeps,
-                            deps=deps,
-                            when=target_ob.when,
-                            )
-      data.target.append(ezt_target)
-
-      if hasattr(target_ob, 'link_cmd'):
-        ezt_target.link_cmd = target_ob.link_cmd
-      if hasattr(target_ob, 'output_dir'):
-        ezt_target.output_dir = target_ob.output_dir
-      if hasattr(target_ob, 'headers_dir'):
-        ezt_target.headers_dir = target_ob.headers_dir
-
-      # Add additional install dependencies if necessary
-      if target_ob.add_install_deps:
-        ezt_target.install = target_ob.install
-        ezt_target.install_deps = target_ob.add_install_deps
-
-      if isinstance(target_ob, gen_base.TargetJava):
-        ezt_target.type = 'java'
-        ezt_target.headers = headers
-        ezt_target.sources = None
-        ezt_target.jar = None
-        ezt_target.classes = target_ob.classes
-
-        # Build the headers from the header_classes with one 'javah' call
-        if headers:
-          ezt_target.header_class_filenames = header_class_filenames
-          ezt_target.header_classes = header_classes
-
-        # Build the objects from the object_srcs with one 'javac' call
-        if object_srcs:
-          ezt_target.sources = object_srcs
-
-        # Once the bytecodes have been compiled up, we produce the
-        # JAR.
-        if target_ob.jar:
-          ezt_target.jar_path = build_path_join(target_ob.classes,
-                                                target_ob.jar)
-          ezt_target.packages = target_ob.packages
-
-      elif isinstance(target_ob, gen_base.TargetI18N):
-        ezt_target.type = 'i18n'
-      else:
-        ezt_target.type = 'n/a'
-        ezt_target.filename = target_ob.filename
-        ezt_target.path = path
-        if (isinstance(target_ob, gen_base.TargetLib)
-            and not target_ob.undefined_lib_symbols):
-          ezt_target.undefined_flag = '$(LT_NO_UNDEFINED)'
-        else:
-          ezt_target.undefined_flag = ''
-        ezt_target.libs = gen_base.unique(libs)
-        ezt_target.objnames = objnames
-        ezt_target.basename = build_path_basename(target_ob.filename)
-
-    ########################################
-
-    for itype, i_targets in install_deps:
-
-      # perl bindings do their own thing, "swig-pl" target is
-      # already specified in Makefile.in
-      if itype == "swig-pl":
-        continue
-
-      outputs = [ ]
-
-      for t in i_targets:
-        if hasattr(t, 'filename'):
-          outputs.append(t.filename)
-
-      data.itargets.append(_eztdata(type=itype, outputs=outputs))
-
-    ########################################
-
-    # for each install group, write a rule to install its outputs
-    for area, inst_targets in install_deps:
-
-      # perl bindings do their own thing, "install-swig-pl" target is
-      # already specified in Makefile.in
-      if area == "swig-pl":
+    # libsvn_foo -> -lsvn_foo-1
+    data.lib_deps.append('-l%s-%s' % (lib_name.replace('lib', '', 1), 
data.version))
+    for lib_dep in lib_deps.split():
+      if lib_dep == 'apriconv':
+        # apriconv is part of apr-util, skip it
         continue
-
-      # get the output files for these targets, sorted in dependency order
-      files = gen_base._sorted_files(self.graph, area)
-
-      ezt_area_type = (area == 'apache-mod' and 'mods-shared' or area)
-      ezt_area = _eztdata(type=ezt_area_type, files=[], extra_install=None)
-
-      def file_to_eztdata(file):
-          # cd to dirname before install to work around libtool 1.4.2 bug.
-          dirname, fname = build_path_splitfile(file.filename)
-          return _eztdata(mode=None,
-                          dirname=dirname, fullname=file.filename,
-                          filename=fname, when=file.when,
-                          pc_fullname=None,
-                          pc_installdir=None,
-                          pc_install_fname=None,)
-
-      def apache_file_to_eztdata(file):
-          # cd to dirname before install to work around libtool 1.4.2 bug.
-          dirname, fname = build_path_splitfile(file.filename)
-          base, ext = os.path.splitext(fname)
-          name = base.replace('mod_', '')
-          return _eztdata(mode='apache-mod',
-                          fullname=file.filename, dirname=dirname,
-                          name=name, filename=fname, when=file.when)
-
-      if area != 'test' and area != 'bdb-test':
-        data.areas.append(ezt_area)
-
-        area_var = area.replace('-', '_')
-        upper_var = area_var.upper()
-        ezt_area.varname = area_var
-        ezt_area.uppervar = upper_var
-
-        for file in files:
-          if isinstance(file.target, gen_base.TargetApacheMod):
-            ezt_file = apache_file_to_eztdata(file)
-          else:
-            ezt_file = file_to_eztdata(file)
-            if area == 'locale':
-              lang, objext = os.path.splitext(ezt_file.filename)
-              installdir = ('$(DESTDIR)$(%sdir)/%s/LC_MESSAGES'
-                            % (area_var, lang))
-              ezt_file.installdir = installdir
-              ezt_file.objext = objext
-            else:
-              ezt_file.install_fname = build_path_join('$(%sdir)' % area_var,
-                                                       ezt_file.filename)
-
-          # Install pkg-config files
-          if (isinstance(file.target, gen_base.TargetLib) and
-              ezt_file.fullname.startswith('subversion/libsvn_')):
-            ezt_file.pc_fullname = ezt_file.fullname.replace('-1.la', '.pc')
-            ezt_file.pc_installdir = '$(pkgconfig_dir)'
-            pc_install_fname = ezt_file.filename.replace('-1.la', '.pc')
-            ezt_file.pc_install_fname = build_path_join(ezt_file.pc_installdir,
-                                                        pc_install_fname)
-          ezt_area.files.append(ezt_file)
-
-        # certain areas require hooks for extra install rules defined
-        # in Makefile.in
-        ### we should turn AREA into an object, then test it instead of this
-        if area[:5] == 'swig-' and area[-4:] != '-lib' \
-           or area[:7] == 'javahl-' \
-           or area[:6] == 'svnxx-' \
-           or area == 'tools':
-          ezt_area.extra_install = 'yes'
-
-    ########################################
-
-    includedir = build_path_join('$(includedir)',
-                                 'subversion-%s' % self.version)
-    data.includes = [_eztdata(file=file,
-                              src=build_path_join('$(abs_srcdir)', file),
-                              dst=build_path_join(includedir,
-                                                  build_path_basename(file)))
-                      for file in self.includes]
-    data.includedir = includedir
-
-    ########################################
-
-    for target in install_sources:
-      if not isinstance(target, gen_base.TargetScript) and \
-         not isinstance(target, gen_base.TargetJava) and \
-         not isinstance(target, gen_base.TargetI18N):
-        data.isources.append(_eztdata(name=target.name,
-                                      filename=target.filename))
-
-    ########################################
-
-    # write dependencies and build rules (when not using suffix rules)
-    # for all other generated files which will not be installed
-    # (or will be installed, but not by the main generated build)
-    obj_deps = sorted(self.graph.get_deps(gen_base.DT_OBJECT),
-                      key=lambda t: t[0].filename)
-
-    for objname, sources in obj_deps:
-      dep = _eztdata(name=_normstr(objname),
-                     when=objname.when,
-                     deps=list(map(_normstr, sources)),
-                     cmd=objname.compile_cmd,
-                     source=_normstr(sources[0]))
-      data.deps.append(dep)
-      dep.generated = ezt.boolean(getattr(objname, 'source_generated', 0))
-
-    template = ezt.Template(os.path.join('build', 'generator', 'templates',
-                                         'build-outputs.mk.ezt'),
-                            compress_whitespace=False)
-    template.generate(open('build-outputs.mk', 'w'), data)
-
-    self.write_standalone()
-
-    self.write_transform_libtool_scripts(install_sources)
-
-    self.write_pkg_config_dot_in_files(install_sources)
-
-  def write_standalone(self):
-    """Write autogen-standalone.mk"""
-
-    standalone = open("autogen-standalone.mk", "w")
-    standalone.write('# DO NOT EDIT -- AUTOMATICALLY GENERATED '
-                     'BY build/generator/gen_make.py\n')
-    standalone.write('# FROM build-outputs.mk\n')
-    standalone.write('abs_srcdir = %s\n' % os.getcwd())
-    standalone.write('abs_builddir = %s\n' % os.getcwd())
-    standalone.write('top_srcdir = .\n')
-    standalone.write('top_builddir = .\n')
-    standalone.write('SWIG = swig\n')
-    swig_py_opts = os.environ.get('SWIG_PY_OPTS',
-                                  '-python -py3 -nofastunpack -modern')
-    standalone.write('SWIG_PY_OPTS = %s\n' % (swig_py_opts))
-    standalone.write('PYTHON = ' + sys.executable + '\n')
-    standalone.write('\n')
-    standalone.write(open("build-outputs.mk","r").read())
-    standalone.close()
-
-  def write_transform_libtool_scripts(self, install_sources):
-    """Write build/transform_libtool_scripts.sh"""
-    script = 'build/transform_libtool_scripts.sh'
-    fd = open(script, 'w')
-    fd.write('''#!/bin/sh
-# DO NOT EDIT -- AUTOMATICALLY GENERATED BY build/generator/gen_make.py
-
-transform()
-{
-  SCRIPT="$1"
-  LIBS="$2"
-  if [ -f $SCRIPT ]; then
-    if grep LD_PRELOAD "$SCRIPT" > /dev/null; then
-      :
-    elif grep LD_LIBRARY_PATH "$SCRIPT" > /dev/null; then
-      echo "Transforming $SCRIPT"
-      EXISTINGLIBS=""
-      for LIB in $LIBS; do
-        # exclude libsvn_test since the undefined test_funcs breaks libtool
-        case $LIB in
-          *libsvn_test-*) continue ;;
-        esac
-        if [ ! -f $LIB ]; then
+      external_lib = sections[lib_dep].options.get('external-lib')
+      if external_lib:
+        ### Some of Subversion's internal libraries can appear as external
+        ### libs to handle conditional compilation. Skip these for now.
+        if external_lib in ['$(SVN_RA_LIB_LINK)', '$(SVN_FS_LIB_LINK)']:
           continue
-        fi
-        if [ -z "$EXISTINGLIBS" ]; then
-          EXISTINGLIBS="$LIB"
-        else
-          EXISTINGLIBS="$EXISTINGLIBS $LIB"
-        fi
-      done
-      if [ ! -z "$EXISTINGLIBS" ]; then
-        cat "$SCRIPT" |
-        (
-          read LINE
-          echo "$LINE"
-          read LINE
-          echo "$LINE"
-          read LINE
-          echo "$LINE"
-          read LINE
-          echo "$LINE"
-          echo "LD_PRELOAD=\\"$EXISTINGLIBS\\""
-          echo "export LD_PRELOAD"
-          cat
-        ) < "$SCRIPT" > "$SCRIPT.new"
-        mv -f "$SCRIPT.new" "$SCRIPT"
-        chmod +x "$SCRIPT"
-      fi
-    fi
-  fi
-}
-
-DIR=`pwd`
-
-''')
-    libdep_cache = {}
-    paths = {}
-    for lib in ('libsvn_auth_gnome_keyring', 'libsvn_auth_kwallet'):
-      paths[lib] = self.sections[lib].options.get('path')
-    for target_ob in install_sources:
-      if not isinstance(target_ob, gen_base.TargetExe):
-        continue
-      name = target_ob.name
-      libs = self._get_all_lib_deps(target_ob.name, libdep_cache, paths)
-      path = paths[name]
-      for i in range(0, len(libs)):
-        lib = libs[i]
-        libpath = paths[libs[i]]
-        libs[i] = '$DIR/%s/.libs/%s-%s.so' % (libpath, lib, self.version)
-      fd.write('transform %s/%s "%s"\n' % (path, name, " ".join(libs)))
-    fd.close()
-    mode = stat.S_IRWXU|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH
-    os.chmod(script, mode)
-
-  def _get_all_lib_deps(self, target_name, libdep_cache, paths):
-    if not target_name in libdep_cache:
-      libs = set()
-      path = None
-      if target_name in self.sections:
-        section = self.sections[target_name]
-        opt_libs = self.sections[target_name].options.get('libs')
-        paths[target_name] = section.options.get('path')
-        if opt_libs:
-          for lib_name in opt_libs.split():
-            if lib_name.startswith('libsvn_'):
-              libs.add(lib_name)
-            for lib in self._get_all_lib_deps(lib_name, libdep_cache, paths):
-              libs.add(lib)
-      if target_name == 'libsvn_subr':
-        libs.update(('libsvn_auth_gnome_keyring', 'libsvn_auth_kwallet'))
-      libdep_cache[target_name] = sorted(libs)
-    return libdep_cache[target_name]
-
-  def write_pkg_config_dot_in_files(self, install_sources):
-    """Write pkg-config .pc.in files for Subversion libraries."""
-    for target_ob in install_sources:
-      if not (isinstance(target_ob, gen_base.TargetLib) and
-              target_ob.path.startswith('subversion/libsvn_')):
-        continue
-
-      lib_name = target_ob.name
-      lib_path = self.sections[lib_name].options.get('path')
-      lib_deps = self.sections[lib_name].options.get('libs')
-      lib_desc = self.sections[lib_name].options.get('description')
-      output_path = build_path_join(lib_path, lib_name + '.pc.in')
-      template = ezt.Template(os.path.join('build', 'generator', 'templates',
-                                           'pkg-config.in.ezt'),
-                              compress_whitespace=False)
-      class _eztdata(object):
-        def __init__(self, **kw):
-          vars(self).update(kw)
-
-      data = _eztdata(
-        lib_name=lib_name,
-        lib_desc=lib_desc,
-        lib_deps=[],
-        lib_required=[],
-        lib_required_private=[],
-        version=self.version,
-        )
-      # libsvn_foo -> -lsvn_foo-1
-      data.lib_deps.append('-l%s-%s' % (lib_name.replace('lib', '', 1), 
data.version))
-      for lib_dep in lib_deps.split():
-        if lib_dep == 'apriconv':
-          # apriconv is part of apr-util, skip it
-          continue
-        external_lib = self.sections[lib_dep].options.get('external-lib')
-        if external_lib:
-          ### Some of Subversion's internal libraries can appear as external
-          ### libs to handle conditional compilation. Skip these for now.
-          if external_lib in ['$(SVN_RA_LIB_LINK)', '$(SVN_FS_LIB_LINK)']:
-            continue
-          # If the external library is known to support pkg-config,
-          # add it to the Required: or Required.private: section.
-          # Otherwise, add the external library to linker flags.
-          pkg_config = self.sections[lib_dep].options.get('pkg-config')
-          if pkg_config:
-            private = self.sections[lib_dep].options.get('pkg-config-private')
-            if private:
-              data.lib_required_private.append(pkg_config)
-            else:
-              data.lib_required.append(pkg_config)
+        # If the external library is known to support pkg-config,
+        # add it to the Required: or Required.private: section.
+        # Otherwise, add the external library to linker flags.
+        pkg_config = sections[lib_dep].options.get('pkg-config')
+        if pkg_config:
+          private = sections[lib_dep].options.get('pkg-config-private')
+          if private:
+            data.lib_required_private.append(pkg_config)
           else:
-            # $(EXTERNAL_LIB) -> @EXTERNAL_LIB@
-            data.lib_deps.append('@%s@' % external_lib[2:-1])
+            data.lib_required.append(pkg_config)
         else:
-          data.lib_required_private.append(lib_dep)
-
-      template.generate(open(output_path, 'w'), data)
+          # $(EXTERNAL_LIB) -> @EXTERNAL_LIB@
+          data.lib_deps.append('@%s@' % external_lib[2:-1])
+      else:
+        data.lib_required_private.append(lib_dep)
 
-class UnknownDependency(Exception):
-  "We don't know how to deal with the dependent to link it in."
-  pass
+    template.generate(open(output_path, 'w'), data)
 
-### End of file.


Reply via email to