17 import multiprocessing
23 from typing
import Dict, List, Union
28 PROJECT_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)),
"..",
30 os.chdir(PROJECT_ROOT)
32 sys.path.append(os.path.join(PROJECT_ROOT,
'tools',
'buildgen',
'plugins'))
36 os.path.join(PROJECT_ROOT,
'tools',
'run_tests',
'python_utils',
39 PREPROCESSED_BUILD =
'.preprocessed_build'
40 test = {}
if os.environ.get(
'TEST',
'false') ==
'true' else None
42 assert sys.argv[1:],
'run generate_projects.sh instead of this directly'
43 parser = argparse.ArgumentParser()
44 parser.add_argument(
'build_files',
47 help=
"build files describing build specs")
48 parser.add_argument(
'--templates',
51 help=
"mako template files to render")
52 parser.add_argument(
'--output_merged',
56 help=
"merge intermediate results to a file")
57 parser.add_argument(
'--jobs',
59 default=multiprocessing.cpu_count(),
61 help=
"maximum parallel jobs")
62 parser.add_argument(
'--base',
65 help=
"base path for generated files")
66 args = parser.parse_args()
70 """Merges build yaml into a one dictionary then pass it to plugins."""
72 for build_file
in args.build_files:
73 with open(build_file,
'r')
as f:
75 yaml.load(f.read(), Loader=yaml.FullLoader))
77 for py_file
in sorted(glob.glob(
'tools/buildgen/plugins/*.py')):
79 plugin.mako_plugin(build_spec)
80 if args.output_merged:
81 with open(args.output_merged,
'w')
as f:
82 f.write(yaml.dump(build_spec))
88 """Generate JobSpecs for each one of the template rendering work."""
90 base_cmd = [sys.executable,
'tools/buildgen/_mako_renderer.py']
91 for template
in sorted(templates, reverse=
True):
92 root, f = os.path.split(template)
93 if os.path.splitext(f)[1] ==
'.template':
94 out_dir = args.base + root[
len(
'templates'):]
95 out = os.path.join(out_dir, os.path.splitext(f)[0])
96 if not os.path.exists(out_dir):
100 cmd.append(PREPROCESSED_BUILD)
105 tf = tempfile.mkstemp()
108 cmd.append(test[out])
109 cmd.append(args.base +
'/' + root +
'/' + f)
110 jobs.append(jobset.JobSpec(cmd, shortname=out,
111 timeout_seconds=
None))
116 templates = args.templates
118 for root, _, files
in os.walk(
'templates'):
120 templates.append(os.path.join(root, f))
123 with open(PREPROCESSED_BUILD,
'wb')
as f:
124 pickle.dump(build_spec, f)
129 print(
'ERROR: %s error(s) found while generating projects.' % err_cnt,
134 for s, g
in test.items():
135 if os.path.isfile(g):
136 assert 0 == os.system(
'diff %s %s' % (s, g)), s
139 assert 0 == os.system(
'diff -r %s %s' % (s, g)), s
140 shutil.rmtree(g, ignore_errors=
True)
143 if __name__ ==
"__main__":