blob: 3666d5a68a25ff6f5afc05f5ad69cfda67ad16b5 [file] [log] [blame]
Beichuan Zhang55b8ed42014-04-26 22:25:44 -07001# inspired by code by Hans-Martin von Gaudecker, 2012
Alexander Afanasyev49272f72014-04-06 21:49:46 -07002
3import os
Davide Pesavento0e7f7342024-03-13 14:00:36 -04004from waflib import Node, Task, TaskGen, Utils
5
Alexander Afanasyev49272f72014-04-06 21:49:46 -07006
7class sphinx_build(Task.Task):
8 color = 'BLUE'
Beichuan Zhang55b8ed42014-04-26 22:25:44 -07009 run_str = '${SPHINX_BUILD} -D ${VERSION} -D ${RELEASE} -q -b ${BUILDERNAME} -d ${DOCTREEDIR} ${SRCDIR} ${OUTDIR}'
Alexander Afanasyev49272f72014-04-06 21:49:46 -070010
11 def __str__(self):
12 env = self.env
Alexander Afanasyev58ea4582014-05-30 08:38:56 +030013 src_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.inputs])
14 tgt_str = ' '.join([a.path_from(a.ctx.launch_node()) for a in self.outputs])
Alexander Afanasyev49272f72014-04-06 21:49:46 -070015 if self.outputs: sep = ' -> '
16 else: sep = ''
17 return'%s [%s]: %s%s%s\n'%(self.__class__.__name__.replace('_task',''),
18 self.env['BUILDERNAME'], src_str, sep, tgt_str)
19
Davide Pesavento0e7f7342024-03-13 14:00:36 -040020
21# from https://docs.python.org/3.12/whatsnew/3.12.html#imp
22def load_source(modname, filename):
23 import importlib.util
24 from importlib.machinery import SourceFileLoader
25 loader = SourceFileLoader(modname, filename)
26 spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
27 module = importlib.util.module_from_spec(spec)
28 loader.exec_module(module)
29 return module
30
31
Alexander Afanasyev49272f72014-04-06 21:49:46 -070032@TaskGen.extension('.py', '.rst')
33def sig_hook(self, node):
34 node.sig=Utils.h_file(node.abspath())
35
Davide Pesavento0e7f7342024-03-13 14:00:36 -040036
Alexander Afanasyev49272f72014-04-06 21:49:46 -070037@TaskGen.feature("sphinx")
38@TaskGen.before_method("process_source")
39def apply_sphinx(self):
40 """Set up the task generator with a Sphinx instance and create a task."""
41
42 inputs = []
43 for i in Utils.to_list(self.source):
44 if not isinstance(i, Node.Node):
45 node = self.path.find_node(node)
46 else:
47 node = i
48 if not node:
49 raise ValueError('[%s] file not found' % i)
50 inputs.append(node)
51
52 task = self.create_task('sphinx_build', inputs)
53
54 conf = self.path.find_node(self.config)
55 task.inputs.append(conf)
56
57 confdir = conf.parent.abspath()
Davide Pesavento08b91c82019-04-13 19:42:10 -040058 buildername = getattr(self, 'builder', 'html')
59 srcdir = getattr(self, 'srcdir', confdir)
60 outdir = self.path.find_or_declare(getattr(self, 'outdir', buildername)).get_bld()
61 doctreedir = getattr(self, 'doctreedir', os.path.join(outdir.abspath(), '.doctrees'))
Alexander Afanasyev49272f72014-04-06 21:49:46 -070062
63 task.env['BUILDERNAME'] = buildername
64 task.env['SRCDIR'] = srcdir
Alexander Afanasyev49272f72014-04-06 21:49:46 -070065 task.env['OUTDIR'] = outdir.abspath()
Davide Pesavento0e7f7342024-03-13 14:00:36 -040066 task.env['DOCTREEDIR'] = doctreedir
Davide Pesavento08b91c82019-04-13 19:42:10 -040067 task.env['VERSION'] = 'version=%s' % self.version
68 task.env['RELEASE'] = 'release=%s' % getattr(self, 'release', self.version)
Alexander Afanasyev49272f72014-04-06 21:49:46 -070069
Davide Pesavento08b91c82019-04-13 19:42:10 -040070 if buildername == 'man':
Davide Pesavento0e7f7342024-03-13 14:00:36 -040071 confdata = load_source('sphinx_conf', conf.abspath())
72 for i in confdata.man_pages:
Alexander Afanasyev49272f72014-04-06 21:49:46 -070073 target = outdir.find_or_declare('%s.%d' % (i[1], i[4]))
74 task.outputs.append(target)
75
76 if self.install_path:
Davide Pesavento08b91c82019-04-13 19:42:10 -040077 self.bld.install_files('%s/man%d/' % (self.install_path, i[4]), target)
Alexander Afanasyev49272f72014-04-06 21:49:46 -070078 else:
79 task.outputs.append(outdir)
80
Davide Pesavento0e7f7342024-03-13 14:00:36 -040081
Alexander Afanasyev49272f72014-04-06 21:49:46 -070082def configure(conf):
83 conf.find_program('sphinx-build', var='SPHINX_BUILD', mandatory=False)
84
Davide Pesavento0e7f7342024-03-13 14:00:36 -040085
Alexander Afanasyev49272f72014-04-06 21:49:46 -070086# sphinx docs
87from waflib.Build import BuildContext
88class sphinx(BuildContext):
89 cmd = "sphinx"
90 fun = "sphinx"