blob: b44a54f4ed5ffbaf650ecc2ce75d5457f9160e2d [file] [log] [blame]
Yingdi Yu40cd1c32014-04-17 15:02:17 -07001#!/usr/bin/env python
2# encoding: utf-8
Vince Lehmanb722b102014-08-24 16:33:49 -05003
4# inspired by code by Hans-Martin von Gaudecker, 2012
Yingdi Yu40cd1c32014-04-17 15:02:17 -07005
6import os
7from waflib import Node, Task, TaskGen, Errors, Logs, Build, Utils
8
9class sphinx_build(Task.Task):
10 color = 'BLUE'
Vince Lehmanb722b102014-08-24 16:33:49 -050011 run_str = '${SPHINX_BUILD} -D ${VERSION} -D ${RELEASE} -q -b ${BUILDERNAME} -d ${DOCTREEDIR} ${SRCDIR} ${OUTDIR}'
Yingdi Yu40cd1c32014-04-17 15:02:17 -070012
13 def __str__(self):
14 env = self.env
Vince Lehmanb722b102014-08-24 16:33:49 -050015 src_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.inputs])
16 tgt_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.outputs])
Yingdi Yu40cd1c32014-04-17 15:02:17 -070017 if self.outputs: sep = ' -> '
18 else: sep = ''
19 return'%s [%s]: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),
20 self.env['BUILDERNAME'], src_str, sep, tgt_str)
21
22@TaskGen.extension('.py', '.rst')
23def sig_hook(self, node):
24 node.sig=Utils.h_file(node.abspath())
25
26@TaskGen.feature("sphinx")
27@TaskGen.before_method("process_source")
28def apply_sphinx(self):
29 """Set up the task generator with a Sphinx instance and create a task."""
30
31 inputs = []
32 for i in Utils.to_list(self.source):
33 if not isinstance(i, Node.Node):
34 node = self.path.find_node(node)
35 else:
36 node = i
37 if not node:
38 raise ValueError('[%s] file not found' % i)
39 inputs.append(node)
40
41 task = self.create_task('sphinx_build', inputs)
42
43 conf = self.path.find_node(self.config)
44 task.inputs.append(conf)
45
46 confdir = conf.parent.abspath()
Davide Pesaventof75bfda2019-11-10 18:34:13 -050047 buildername = getattr(self, 'builder', 'html')
48 srcdir = getattr(self, 'srcdir', confdir)
49 outdir = self.path.find_or_declare(getattr(self, 'outdir', buildername)).get_bld()
50 doctreedir = getattr(self, 'doctreedir', os.path.join(outdir.abspath(), '.doctrees'))
Yingdi Yu40cd1c32014-04-17 15:02:17 -070051
52 task.env['BUILDERNAME'] = buildername
53 task.env['SRCDIR'] = srcdir
54 task.env['DOCTREEDIR'] = doctreedir
55 task.env['OUTDIR'] = outdir.abspath()
Davide Pesaventof75bfda2019-11-10 18:34:13 -050056 task.env['VERSION'] = 'version=%s' % self.version
57 task.env['RELEASE'] = 'release=%s' % getattr(self, 'release', self.version)
Yingdi Yu40cd1c32014-04-17 15:02:17 -070058
59 import imp
60 confData = imp.load_source('sphinx_conf', conf.abspath())
61
Davide Pesaventof75bfda2019-11-10 18:34:13 -050062 if buildername == 'man':
Yingdi Yu40cd1c32014-04-17 15:02:17 -070063 for i in confData.man_pages:
64 target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
65 task.outputs.append(target)
66
67 if self.install_path:
Davide Pesaventof75bfda2019-11-10 18:34:13 -050068 self.bld.install_files('%s/man%d/' % (self.install_path, i[4]), target)
Yingdi Yu40cd1c32014-04-17 15:02:17 -070069 else:
70 task.outputs.append(outdir)
71
72def configure(conf):
73 conf.find_program('sphinx-build', var='SPHINX_BUILD', mandatory=False)
74
75# sphinx docs
76from waflib.Build import BuildContext
77class sphinx(BuildContext):
78 cmd = "sphinx"
79 fun = "sphinx"