[PATCH 2/4] waf: Add support to build PlantUML and Ditaa images.

chrisj at rtems.org chrisj at rtems.org
Fri Nov 2 05:55:22 UTC 2018


From: Chris Johns <chrisj at rtems.org>

---
 README.txt        | 17 +++++++++++++-
 common/waf.py     | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 images/.gitignore |  1 +
 images/wscript    |  7 ++++++
 wscript           |  6 +++++
 5 files changed, 99 insertions(+), 2 deletions(-)
 create mode 100644 images/.gitignore
 create mode 100644 images/wscript

diff --git a/README.txt b/README.txt
index a7380a9..203c45d 100644
--- a/README.txt
+++ b/README.txt
@@ -115,6 +115,16 @@ Single HTML:
   # pkg install npm
   # npm install -g inliner
 
+Plant UML:
+
+Install NPM as shown in Single HTML then:
+
+  # npm install -g node-plantuml
+
+Ditaa:
+
+  # pkg install ditaa
+
 CentOS 6 and 7
 ~~~~~~~~~~~~~~
 
@@ -151,10 +161,15 @@ Single HTML:
 NOTE: npm appears to be part of the EPEL repository for RHEL and CentOS.
 You may have to add that repository to your configuration.
 
-
   # yum install npm
   # npm install -g inliner
 
+Plant UML:
+
+Install NPM as shown in Single HTML then:
+
+  # npm install -g node-plantuml
+
 Spell check:
 
   # yum install aspell
diff --git a/common/waf.py b/common/waf.py
index 3f0fcc1..692d4de 100644
--- a/common/waf.py
+++ b/common/waf.py
@@ -257,9 +257,37 @@ def cmd_configure(ctx):
             ctx.env.BUILD_SINGLEHTML = 'yes'
             ctx.find_program("inliner", var = "BIN_INLINER", mandatory = False)
             if not ctx.env.BIN_INLINER:
-                ctx.fatal("Node inliner is required install with 'npm install -g inliner' " +
+                ctx.fatal("Node.js inliner is required install with 'npm install -g inliner' " +
                           "(https://github.com/remy/inliner)")
 
+    ctx.envBUILD_PLANTUML = 'no'
+    if ctx.options.plantuml:
+        check_plantuml = not ctx.env.BIN_PUML
+        if check_plantuml:
+            ctx.env.BUILD_PLANTUML = 'yes'
+            ctx.find_program("puml", var = "BIN_PUML", mandatory = False)
+            if not ctx.env.BIN_PUML:
+                ctx.fatal("Node.js puml is required install with 'npm install -g node-plantuml' " +
+                          "(https://www.npmjs.com/package/node-plantuml)")
+
+    ctx.envBUILD_DITAA = 'no'
+    if ctx.options.ditaa:
+        #
+        # We use DITAA via PlantUML
+        #
+        if not ctx.env.BIN_PUML:
+            ctx.find_program("puml", var = "BIN_PUML", mandatory = False)
+            if not ctx.env.BIN_PUML:
+                ctx.fatal("DITAA uses PlantUML; " +
+                          "Node.js puml is required install with 'npm install -g node-plantuml' " +
+                          "(https://www.npmjs.com/package/node-plantuml)")
+        check_ditaa = not ctx.env.BIN_DITAA
+        if check_ditaa:
+            ctx.env.BUILD_DITAA = 'yes'
+            ctx.find_program("ditaa", var = "BIN_DITAA", mandatory = False)
+            if not ctx.env.BIN_DITAA:
+                ctx.fatal("DITAA not found, plase install")
+
 def doc_pdf(ctx, source_dir, conf_dir, extra_source):
     buildtype = 'latex'
     build_dir, output_node, output_dir, doctrees = build_dir_setup(ctx, buildtype)
@@ -353,6 +381,30 @@ def doc_html(ctx, source_dir, conf_dir, extra_source):
                       relative_trick = True,
                       quiet = True)
 
+def images_plantuml(ctx, source_dir, conf_dir, ext):
+    #
+    # Use a run command to handle stdout and stderr output from puml.
+    #
+    def run(task):
+        src = task.inputs[0].abspath()
+        tgt = task.outputs[0].abspath()
+        cmd = '%s generate %s -o %s' % (task.env.BIN_PUML[0], src, tgt)
+        so = open(tgt + '.out', 'w')
+        r = task.exec_command(cmd, stdout = so, stderr = so)
+        so.close()
+        return r
+
+    for src in ctx.path.ant_glob('**/*' + ext):
+        tgt = src.abspath()[: - len(ext)] + '.png'
+        ctx(
+            rule         = run,
+            inliner      = ctx.env.BIN_PUML,
+            source       = src,
+            target       = tgt,
+            install_path = None
+    )
+
+
 def cmd_build(ctx, extra_source = []):
     conf_dir = ctx.path.get_src()
     source_dir = ctx.path.get_src()
@@ -365,6 +417,14 @@ def cmd_build(ctx, extra_source = []):
 
     doc_html(ctx, source_dir, conf_dir, extra_source)
 
+def cmd_build_images(ctx):
+    conf_dir = ctx.path.get_src()
+    source_dir = ctx.path.get_src()
+    if ctx.env.BUILD_PLANTUML == 'yes':
+        images_plantuml(ctx, source_dir, conf_dir, '.puml')
+    if ctx.env.BUILD_DITAA == 'yes':
+        images_plantuml(ctx, source_dir, conf_dir, '.ditaa')
+
 def cmd_options(ctx):
     ctx.add_option('--disable-extra-fonts',
                    action = 'store_true',
@@ -382,6 +442,14 @@ def cmd_options(ctx):
                    action = 'store_true',
                    default = False,
                    help = "Build Single HTML file, requires Node Inliner")
+    ctx.add_option('--plantuml',
+                   action = 'store_true',
+                   default = False,
+                   help = "Build PlantUML images from source, need puml from npm")
+    ctx.add_option('--ditaa',
+                   action = 'store_true',
+                   default = False,
+                   help = "Build DITAA images using PlantUML from source, need ditaa and puml")
 
 def cmd_options_path(ctx):
     cmd_options(ctx)
diff --git a/images/.gitignore b/images/.gitignore
new file mode 100644
index 0000000..f47cb20
--- /dev/null
+++ b/images/.gitignore
@@ -0,0 +1 @@
+*.out
diff --git a/images/wscript b/images/wscript
new file mode 100644
index 0000000..41a9308
--- /dev/null
+++ b/images/wscript
@@ -0,0 +1,7 @@
+from sys import path
+from os.path import abspath
+path.append(abspath('../common/'))
+
+from waf import cmd_configure as configure
+from waf import cmd_build_images as build
+from waf import cmd_options as options
diff --git a/wscript b/wscript
index 8fd22ac..5ce7f0d 100644
--- a/wscript
+++ b/wscript
@@ -53,6 +53,12 @@ def coverpage_js(ctx):
         o.write(js.replace('@CATALOGUE', xml))
 
 def build(ctx):
+    #
+    # Generate any PlantUML images if enabled.
+    #
+    ctx.recurse('images')
+    ctx.add_group('images')
+
     for b in building:
         ctx.recurse(b)
 
-- 
2.14.1




More information about the devel mailing list