blob: 8585352a4990b5ebe415ae16e993a227e262a2cd [file] [log] [blame]
Alexander Afanasyev1160baa2014-04-10 18:50:29 -07001# inspired by code by Hans-Martin von Gaudecker, 2012
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -08002
3import os
Alexander Afanasyev1160baa2014-04-10 18:50:29 -07004from waflib import Node, Task, TaskGen, Errors, Logs, Build, Utils
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -08005
Alexander Afanasyev1160baa2014-04-10 18:50:29 -07006class sphinx_build(Task.Task):
7 color = 'BLUE'
Alexander Afanasyeva06fdda2014-04-29 19:15:00 -07008 run_str = '${SPHINX_BUILD} -D ${VERSION} -D ${RELEASE} -q -b ${BUILDERNAME} -d ${DOCTREEDIR} ${SRCDIR} ${OUTDIR}'
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -08009
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070010 def __str__(self):
11 env = self.env
Alexander Afanasyev8b1674a2014-05-15 00:58:43 -070012 src_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.inputs])
13 tgt_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.outputs])
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070014 if self.outputs: sep = ' -> '
15 else: sep = ''
16 return'%s [%s]: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),
17 self.env['BUILDERNAME'], src_str, sep, tgt_str)
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080018
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070019@TaskGen.extension('.py', '.rst')
20def sig_hook(self, node):
21 node.sig=Utils.h_file(node.abspath())
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080022
23@TaskGen.feature("sphinx")
24@TaskGen.before_method("process_source")
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070025def apply_sphinx(self):
26 """Set up the task generator with a Sphinx instance and create a task."""
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080027
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070028 inputs = []
29 for i in Utils.to_list(self.source):
30 if not isinstance(i, Node.Node):
31 node = self.path.find_node(node)
32 else:
33 node = i
34 if not node:
35 raise ValueError('[%s] file not found' % i)
36 inputs.append(node)
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080037
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070038 task = self.create_task('sphinx_build', inputs)
Alexander Afanasyev5e1288e2014-03-28 11:11:48 -070039
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070040 conf = self.path.find_node(self.config)
41 task.inputs.append(conf)
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080042
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070043 confdir = conf.parent.abspath()
Davide Pesaventob310efb2019-04-11 22:10:24 -040044 buildername = getattr(self, 'builder', 'html')
45 srcdir = getattr(self, 'srcdir', confdir)
46 outdir = self.path.find_or_declare(getattr(self, 'outdir', buildername)).get_bld()
47 doctreedir = getattr(self, 'doctreedir', os.path.join(outdir.abspath(), '.doctrees'))
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080048
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070049 task.env['BUILDERNAME'] = buildername
50 task.env['SRCDIR'] = srcdir
51 task.env['DOCTREEDIR'] = doctreedir
52 task.env['OUTDIR'] = outdir.abspath()
Davide Pesaventob310efb2019-04-11 22:10:24 -040053 task.env['VERSION'] = 'version=%s' % self.version
54 task.env['RELEASE'] = 'release=%s' % getattr(self, 'release', self.version)
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080055
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070056 import imp
57 confData = imp.load_source('sphinx_conf', conf.abspath())
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080058
Davide Pesaventob310efb2019-04-11 22:10:24 -040059 if buildername == 'man':
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070060 for i in confData.man_pages:
61 target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
62 task.outputs.append(target)
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080063
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070064 if self.install_path:
Davide Pesaventob310efb2019-04-11 22:10:24 -040065 self.bld.install_files('%s/man%d/' % (self.install_path, i[4]), target)
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070066 else:
67 task.outputs.append(outdir)
68
69def configure(conf):
70 conf.find_program('sphinx-build', var='SPHINX_BUILD', mandatory=False)
Alexander Afanasyev5e1288e2014-03-28 11:11:48 -070071
72# sphinx docs
73from waflib.Build import BuildContext
Alexander Afanasyev1160baa2014-04-10 18:50:29 -070074class sphinx(BuildContext):
Alexander Afanasyev5e1288e2014-03-28 11:11:48 -070075 cmd = "sphinx"
76 fun = "sphinx"