16 from pathlib
import Path
17 from SCons.Builder
import Builder
21 re.compile(
r'^REG_MODULE\((\S*)\)$', re.M)
24 def module_io_emitter(target, source, env):
26 if not env.get(
'HAS_DOT',
False):
27 return (target, source)
28 for source_file
in source:
29 contents = source_file.get_text_contents()
30 for entry
in module_re.findall(contents):
31 target.append(os.path.join(
'build',
'module_io', entry +
'.png'))
32 return (target, source)
35 def module_io(target, source, env):
36 for target_file
in target:
38 Path(str(target_file)).touch()
40 dir = os.path.dirname(str(target_file))
41 module = os.path.splitext(os.path.basename(str(target_file)))[0]
42 if module
in [
'EclDisplay',
'Rbuf2Ds',
'FastRbuf2Ds',
'Rbuf2Rbuf',
'Ds2Raw']:
46 subprocess.run([
'basf2',
'--module-io', module],
47 stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=dir, timeout=60)
51 subprocess.run([
'dot', module +
'.dot',
'-Tpng',
'-o', module +
'.png'],
52 stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=dir, timeout=60)
59 def doxygen_groups_emitter(target, source, env):
60 return ([
'Doxygen.h'], [])
63 def doxygen_groups(target, source, env):
64 groups_file = open(str(target[0]),
'w')
66 /** @defgroup DataObjects Data objects
69 /** @defgroup Modules Modules
72 /** @defgroup Packages Packages
77 for package
in env[
'AVAILABLE_PACKAGES']:
78 groups_file.write(f
"""
79 /** @defgroup {package} {package}
83 /** @defgroup {package}_dataobjects {package} data objects
85 * @ingroup DataObjects
88 /** @defgroup {package}_modules {package} modules
97 def doxyfile(target, source, env):
98 content = source[0].get_text_contents().replace(
'BELLE2_RELEASE', env.GetOption(
'doxygen'))
99 if env.get(
'HAS_DOT',
False):
100 content = content.replace(
'HAVE_DOT = NO',
'HAVE_DOT = YES')
101 target_file = open(str(target[0]),
'w')
102 target_file.write(content)
107 moduleio = Builder(action=module_io, emitter=module_io_emitter)
108 moduleio.action.cmdstr =
'${MODULEIOCOMSTR}'
111 doxygen = Builder(action=f
'doxygen $SOURCE 2>&1 > build/doxygen.log | sed "s;^{os.environ.get("BELLE2_LOCAL_DIR", "")}/;;g" 1>&2',
112 emitter=
lambda target, source, env: ([
'build/doxygen/html/index.html'], source))
116 env[
'BUILDERS'][
'ModuleIo'] = moduleio
117 env[
'BUILDERS'][
'DoxygenGroups'] = Builder(action=doxygen_groups, emitter=doxygen_groups_emitter)
118 env[
'BUILDERS'][
'Doxyfile'] = Builder(action=doxyfile)
119 env[
'BUILDERS'][
'Doxygen'] = doxygen
120 for builder
in [
'DoxygenGroups',
'Doxyfile',
'Doxygen']:
121 env[
'BUILDERS'][builder].action.cmdstr =
'${DOXYGENCOMSTR}'