From 782b4fec717a9e9d99ad08b42c0e807c0e38c777 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Tue, 10 Jan 2017 10:11:05 +1100 Subject: waf: Improved XML Catalogue generator. --- common/waf.py | 85 ++++++++++++++++++++++++++++------------------------------- wscript | 11 ++++---- 2 files changed, 47 insertions(+), 49 deletions(-) diff --git a/common/waf.py b/common/waf.py index 9eb7173..9b4b1dc 100644 --- a/common/waf.py +++ b/common/waf.py @@ -86,15 +86,6 @@ def build_dir_setup(ctx, buildtype): output_node = ctx.path.get_bld().make_node(buildtype) output_dir = output_node.abspath() doctrees = os.path.join(os.path.dirname(output_dir), 'doctrees', buildtype) - # - # Gather the data for the catalogue - # - if build_dir not in ctx.catalogue: - ctx.catalogue[build_dir] = { - 'builddir': build_dir, - 'buildtype': [] - } - ctx.catalogue[build_dir]['buildtype'].append(buildtype) return build_dir, output_node, output_dir, doctrees def pdf_resources(ctx, buildtype): @@ -322,31 +313,38 @@ def cmd_configure_path(ctx): cmd_configure(ctx) -def xml_catalogue(ctx): +def xml_catalogue(ctx, building): + # + # The following is a hack to find the top_dir because the task does + # provided a reference to top_dir like a build context. + # + top_dir = ctx.get_cwd().find_node('..') # # Read the conf.py files in each directory to gather the doc details. # + catalogue = {} sp = sys.path[:] - for t in ctx.cur_tasks: - if t.get_cwd().is_src(): - doc = os.path.basename(t.get_cwd().get_src().abspath()) - sys.path.insert(0, str(t.get_cwd())) - # - # Import using the imp API so the module is reloaded for us. - # - import imp - mf = imp.find_module('conf') - try: - bconf = imp.load_module('bconf', mf[0], mf[1], mf[2]) - finally: - mf[0].close() - sys.path = sp[:] - if doc in ctx.catalogue: - ctx.catalogue[doc]['title'] = bconf.project - ctx.catalogue[doc]['version'] = bconf.version - ctx.catalogue[doc]['release'] = bconf.release - ctx.catalogue[doc]['latex'] = bconf.latex_documents[0][1] - bconf = None + for doc in building: + sys.path.insert(0, top_dir.find_node(doc).abspath()) + # + # Import using the imp API so the module is reloaded for us. + # + import imp + mf = imp.find_module('conf') + try: + bconf = imp.load_module('bconf', mf[0], mf[1], mf[2]) + finally: + mf[0].close() + sys.path = sp[:] + catalogue[doc] = { + 'title': bconf.project, + 'version': bconf.version, + 'release': bconf.release, + 'pdf': bconf.latex_documents[0][1].replace('.tex', '.pdf'), + 'html': '%s/index.html' % (doc), + 'singlehtml': '%s.html' % (doc) + } + bconf = None import xml.dom.minidom as xml cat = xml.Document() @@ -355,39 +353,38 @@ def xml_catalogue(ctx): root.setAttribute('date', 'today') cat.appendChild(root) - for d in ctx.catalogue: + builds = ['html'] + if ctx.env.BUILD_PDF == 'yes': + builds += ['pdf'] + if ctx.env.BUILD_SINGLEHTML == 'yes': + builds += ['singlehtml'] + + for d in building: doc = cat.createElement('doc') name = cat.createElement('name') text = cat.createTextNode(d) name.appendChild(text) title = cat.createElement('title') - text = cat.createTextNode(ctx.catalogue[d]['title']) + text = cat.createTextNode(catalogue[d]['title']) title.appendChild(text) release = cat.createElement('release') - text = cat.createTextNode(ctx.catalogue[d]['release']) + text = cat.createTextNode(catalogue[d]['release']) release.appendChild(text) version = cat.createElement('version') - text = cat.createTextNode(ctx.catalogue[d]['version']) + text = cat.createTextNode(catalogue[d]['version']) version.appendChild(text) doc.appendChild(name) doc.appendChild(title) doc.appendChild(release) doc.appendChild(version) - for b in ctx.catalogue[d]['buildtype']: - if b == 'latex': - b = 'pdf' - ref = ctx.catalogue[d]['latex'].replace('.tex', '.pdf') - elif b == 'html': - ref = '%s/index.html' % (d) - else: - ref = 'undefined' + for b in builds: output = cat.createElement(b) - text = cat.createTextNode(ref) + text = cat.createTextNode(catalogue[d][b]) output.appendChild(text) doc.appendChild(output) root.appendChild(doc) - catnode = ctx.path.get_bld().make_node('catalogue.xml') + catnode = ctx.get_cwd().make_node('catalogue.xml') catnode.write(cat.toprettyxml(indent = ' ' * 2, newl = os.linesep)) cat.unlink() diff --git a/wscript b/wscript index 2147c5b..eff1113 100644 --- a/wscript +++ b/wscript @@ -6,6 +6,7 @@ from sys import path from os.path import abspath path.append(abspath('common')) +import waflib import waf as docs_waf build_all = ['bsp-howto', @@ -30,15 +31,15 @@ def configure(conf): conf.recurse(b) conf.env['BUILD_FROM_TOP'] = 'yes' -def xml_catalogue(ctx): - docs_waf.xml_catalogue(ctx) +def catalogue(ctx): + docs_waf.xml_catalogue(ctx, building) def build(ctx): - ctx.catalogue = {} - ctx.add_post_fun(xml_catalogue) for b in building: ctx.recurse(b) - ctx.install_files('${PREFIX}', 'catalogue.xml') + ctx(rule = catalogue, + target = 'catalogue.xml', + source = ['wscript', 'common/waf.py']) def install(ctx): for b in building: -- cgit v1.2.3