Author: rinrab
Date: Thu Jun 27 11:49:23 2024
New Revision: 1918702

URL: http://svn.apache.org/viewvc?rev=1918702&view=rev
Log:
On the 'cmake' branch: Generate a list of executable and library targets with
source file lists.

External dependencies and dependencies between targets are not yet done.
Currently, there are only a simple list of targets with theirs sources.

* build/generator/gen_cmake.py
  (cmake_target): New class for storing target and its data.

  (get_target_type): New function which transforms target type into a
   string name.

  (Generator.write): Retrieve and enumerate targets from 'graph' to
   convert them into list of internal cmake_target objects.

  (Generator.get_install_sources,
   Generator.get_dependecies,
   Generator.check_ignore_target): New methods.

* build/generator/templates/CMakeLists.txt.ezt
  (): Enumerate targets from ezt data and create CMake targets, using
   add_library() or add_executable() with name and sources of the target.

Modified:
    subversion/branches/cmake/build/generator/gen_cmake.py
    subversion/branches/cmake/build/generator/templates/CMakeLists.txt.ezt

Modified: subversion/branches/cmake/build/generator/gen_cmake.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/cmake/build/generator/gen_cmake.py?rev=1918702&r1=1918701&r2=1918702&view=diff
==============================================================================
--- subversion/branches/cmake/build/generator/gen_cmake.py (original)
+++ subversion/branches/cmake/build/generator/gen_cmake.py Thu Jun 27 11:49:23 
2024
@@ -7,6 +7,29 @@ class _eztdata(object):
   def __init__(self, **kw):
     vars(self).update(kw)
 
+class cmake_target():
+  def __init__(self, name: str, type: str, sources):
+    self.name = name
+    self.type = type
+    self.sources = sources
+
+def get_target_type(target: gen_base.Target):
+  if isinstance(target, gen_base.TargetExe):
+    if target.install == "test" and target.testing != "skip":
+      return "test"
+    else:
+      return "exe"
+  if isinstance(target, gen_base.TargetSWIG):
+    return "swig"
+  if isinstance(target, gen_base.TargetSWIGProject):
+    return "swig-project"
+  if isinstance(target, gen_base.TargetSWIGLib):
+    return "swig-lib"
+  if isinstance(target, gen_base.TargetLib):
+    return "lib"
+  else:
+    return str(type(target))
+
 class Generator(gen_base.GeneratorBase):
   _extension_map = {
     ('exe', 'target'): '.exe',
@@ -23,11 +46,103 @@ class Generator(gen_base.GeneratorBase):
     gen_base.GeneratorBase.__init__(self, fname, verfname, options)
 
   def write(self):
+    targets = []
+
+    for target in self.get_install_sources():
+      target: gen_base.Target
+
+      if isinstance(target, gen_base.TargetScript):
+        # there is nothing to build
+        continue
+      elif isinstance(target, gen_base.TargetExe):
+        if target.install == "test" or target.install == "sub-test":
+          pass
+        elif target.install == "tools":
+          pass
+        else:
+          pass
+      elif isinstance(target, gen_base.TargetRaModule):
+        pass
+      elif isinstance(target, gen_base.TargetFsModule):
+        pass
+      elif isinstance(target, gen_base.TargetApacheMod):
+        pass
+      elif isinstance(target, gen_base.TargetLib):
+        pass
+
+      sources = []
+
+      for dep in self.get_dependecies(target.name):
+        if isinstance(dep, gen_base.TargetLinked):
+          # TODO:
+          pass
+        elif isinstance(dep, gen_base.ObjectFile):
+          deps = self.graph.get_sources(gen_base.DT_OBJECT,
+                                        dep,
+                                        gen_base.SourceFile)
+          for dep in deps:
+            sources.append(dep.filename)
+
+      target = cmake_target(
+        name = target.name,
+        type = get_target_type(target),
+        sources = sources
+      )
+
+      targets.append(target)
+
     data = _eztdata(
-      targets = "targets",
+      targets = targets,
     )
 
     template = ezt.Template(os.path.join('build', 'generator', 'templates',
                                          'CMakeLists.txt.ezt'),
                             compress_whitespace=False)
     template.generate(open('CMakeLists.txt', 'w'), data)
+
+  def get_install_sources(self):
+    install_sources = self.graph.get_all_sources(gen_base.DT_INSTALL)
+    result = []
+
+    for target in install_sources:
+      target: gen_base.Target
+
+      if not self.check_ignore_target(target):
+        result.append(target)
+
+    result.sort(key = lambda s: s.name)
+
+    return result
+
+  def get_dependecies(self, target_name):
+    deps = []
+
+    deps += self.graph.get_sources(gen_base.DT_LINK, target_name)
+    deps += self.graph.get_sources(gen_base.DT_NONLIB, target_name)
+
+    return deps
+
+  def check_ignore_target(self, target: gen_base.Target):
+    ignore_names = [
+      "libsvn_auth_gnome_keyring",
+      "libsvn_auth_kwallet",
+
+      "libsvnxx",
+      "svnxx-tests",
+
+      "mod_authz_svn",
+      "mod_dav_svn",
+      "mod_dontdothat",
+
+      "libsvnjavahl",
+      "__JAVAHL__",
+      "__JAVAHL_TESTS__",
+    ]
+
+    for name in ignore_names:
+      if target.name == name:
+        return True
+
+      if isinstance(target, gen_base.TargetExe):
+        if target.install == "bdb-test":
+          return True

Modified: subversion/branches/cmake/build/generator/templates/CMakeLists.txt.ezt
URL: 
http://svn.apache.org/viewvc/subversion/branches/cmake/build/generator/templates/CMakeLists.txt.ezt?rev=1918702&r1=1918701&r2=1918702&view=diff
==============================================================================
--- subversion/branches/cmake/build/generator/templates/CMakeLists.txt.ezt 
(original)
+++ subversion/branches/cmake/build/generator/templates/CMakeLists.txt.ezt Thu 
Jun 27 11:49:23 2024
@@ -1,5 +1,12 @@
 cmake_minimum_required(VERSION 3.12)
 
 project("Subversion")
-
-# TODO: [targets]
+[for targets][is targets.type "lib"]
+add_library([targets.name][for targets.sources]
+  [targets.sources]
+[end])
+[end][is targets.type "exe"]
+add_executable([targets.name][for targets.sources]
+  [targets.sources]
+[end])
+[end][end]


Reply via email to