blob: a1ab13745b18b4394f9b30adcd2facaacfe84bff [file] [log] [blame]
Miklos Balint3a05c9d2018-05-31 09:31:27 +02001#-------------------------------------------------------------------------------
2# Copyright (c) 2018, Arm Limited. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6#-------------------------------------------------------------------------------
7
Miklos Balint0687dfc2018-06-01 13:44:00 +02008from __future__ import unicode_literals
9import os, re, io
10from keyword_substitution import keyword_substitute, Verbosity, log_print, REkeychain
Miklos Balint3a05c9d2018-05-31 09:31:27 +020011
12VERBOSITY = Verbosity.warning
13log_print(Verbosity.debug, "Setting verbosity to", VERBOSITY, verbosity=VERBOSITY)
14
15controlsymbol = "@!GENERATOR"
16controlblockstart = "@!GENERATOR_BLOCK_START!@"
17controlblockend = "@!GENERATOR_BLOCK_END!@"
18controlconditionstart = "@!GENERATOR_CONDITIONAL_START!@"
19controlconditionelse = "@!GENERATOR_CONDITIONAL_ELSE!@"
20controlconditionend = "@!GENERATOR_CONDITIONAL_END!@"
21control_print_iteration_counter = "@!GENERATOR_ITERATION_COUNTER!@"
22control_print_donotedit_warning = "@!GENERATOR_DONOTEDIT_WARNING!@"
23
24donotedit_warning = "/*********** " + \
25 "WARNING: This is an auto-generated file. Do not edit!" + \
26 " ***********/\n"
27
28# All operations assume tf-m repo root as active working directory
29
30# Functions
Miklos Balint0687dfc2018-06-01 13:44:00 +020031def substitute(manifest, line, MISSING_KEYS_ACTION):
32 outlist = keyword_substitute(manifest, line, MISSING_KEYS_ACTION)
33 outstring = ""
34 for outline in outlist:
35 outstring += ''.join(outline)
36 log_print(Verbosity.info, outstring)
37 return outstring
38
Miklos Balint3a05c9d2018-05-31 09:31:27 +020039def generate(db, outfile_name):
Miklos Balint0687dfc2018-06-01 13:44:00 +020040 outfile = io.open(outfile_name, "w", newline='\n')
41 with io.open(outfile_name + '.template', "r") as template_file:
Miklos Balint3a05c9d2018-05-31 09:31:27 +020042 template = template_file.readlines()
43
44 output = []
45 blocks = []
46 blocklines = []
47 MISSING_KEYS_ACTION = 'replace False'
48 inblock = False
49 iteration_counter = 0
50 for lineno, line in enumerate(template):
51 if controlblockstart in line:
52 inblock = True
53 log_print(Verbosity.info, "Blockstart:", str(lineno))
54 blocklines = []
55 elif controlblockend in line:
56 inblock = False
57 iteration_counter = 0
58 log_print(Verbosity.info, "Blocklines:", str(blocklines))
59 for manifest in db:
Miklos Balint0687dfc2018-06-01 13:44:00 +020060 ignore_line = False
Miklos Balint3a05c9d2018-05-31 09:31:27 +020061 for line in blocklines:
Miklos Balint0687dfc2018-06-01 13:44:00 +020062 if controlconditionstart in line:
63 outstring = substitute(manifest, line, MISSING_KEYS_ACTION)
Miklos Balint3a05c9d2018-05-31 09:31:27 +020064 if 'False' in outstring:
65 log_print(Verbosity.info, "PRINT BLOCKED")
Miklos Balint0687dfc2018-06-01 13:44:00 +020066 ignore_line = True
67 elif controlconditionend in line:
Miklos Balint3a05c9d2018-05-31 09:31:27 +020068 log_print(Verbosity.info, "PRINT ENABLED")
Miklos Balint0687dfc2018-06-01 13:44:00 +020069 ignore_line = False
70 elif controlconditionelse in line:
71 log_print(Verbosity.info, "PRINT " + str(ignore_line))
72 ignore_line = not ignore_line
73 elif not ignore_line:
74 if re.search(REkeychain, line):
75 outstring = substitute(manifest, line, MISSING_KEYS_ACTION)
76 else:
77 outstring = line
Miklos Balint3a05c9d2018-05-31 09:31:27 +020078 if control_print_iteration_counter in outstring:
79 outstring = outstring.replace(
80 control_print_iteration_counter,
81 str(iteration_counter))
82 elif controlsymbol in outstring:
83 print "Invalid control symbol:", outstring
84 print "exiting"
85 exit(1)
Miklos Balint0687dfc2018-06-01 13:44:00 +020086 outfile.write(outstring)
Miklos Balint3a05c9d2018-05-31 09:31:27 +020087 iteration_counter += 1
88 # end for manifest in db
89 blocks.append(blocklines)
90 elif inblock:
91 # inside a generator block
92 # append line to blocklines to be processed by template generator
93 blocklines.append(line)
94 else:
95 # outside a generator block
96 if control_print_donotedit_warning in line:
97 # print do not edit warning - Note: ignore rest of input line
98 line = donotedit_warning
99 elif control_print_iteration_counter in line:
100 # line contains an iteration counter request, replace with value
101 line = line.replace(control_print_iteration_counter, str(iteration_counter))
102 elif controlsymbol in line:
103 print "Invalid control symbol:", line
104 print "exiting"
105 exit(1)
106 outfile.write(line)
107 log_print(Verbosity.debug, "Blocks:" + str(blocks))
108 outfile.close()
109# def generate()
110
111def generate_from_template_file(db, file_list):
112 for file in file_list:
113 outfile = file["output"]
Miklos Balint0687dfc2018-06-01 13:44:00 +0200114 print "Generating", outfile
Miklos Balint3a05c9d2018-05-31 09:31:27 +0200115 generate(db, outfile)