blob: 3075fe75280329f07f23326bd068f643479ca822 [file] [log] [blame]
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +01001#!/usr/bin/env python3
2
3""" build_helper.py:
4
5 Build helper instantiates a build manager with user provided arguments,
6 or default ones.
7 """
8
9from __future__ import print_function
10
11__copyright__ = """
12/*
Karl Zhang08681e62020-10-30 13:56:03 +080013 * Copyright (c) 2018-2020, Arm Limited. All rights reserved.
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010014 *
15 * SPDX-License-Identifier: BSD-3-Clause
16 *
17 */
18 """
Karl Zhang08681e62020-10-30 13:56:03 +080019
20__author__ = "tf-m@lists.trustedfirmware.org"
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010021__project__ = "Trusted Firmware-M Open CI"
Xinyu Zhang06286a92021-07-22 14:00:51 +080022__version__ = "1.4.0"
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010023
24import os
25import sys
26import time
27import argparse
28import datetime
Minos Galanakisea421232019-06-20 17:11:28 +010029from build_helper_configs import _builtin_configs
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010030
31try:
Minos Galanakisea421232019-06-20 17:11:28 +010032 from tfm_ci_pylib.utils import get_cmd_args
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010033 from tfm_ci_pylib.tfm_build_manager import TFM_Build_Manager
34except ImportError:
35 dir_path = os.path.dirname(os.path.realpath(__file__))
36 sys.path.append(os.path.join(dir_path, "../"))
37 from tfm_ci_pylib.utils import get_cmd_args, load_json
38 from tfm_ci_pylib.tfm_build_manager import TFM_Build_Manager
39
40
Minos Galanakisea421232019-06-20 17:11:28 +010041def build(tfm_dir,
42 build_dir,
43 buid_report_f,
44 build_config,
45 parallel_builds=3,
46 build_threads=3,
47 build_install=True,
48 image_sizes=False,
49 relative_paths=False):
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010050 """ Instantiate a build manager class and build all configurations """
51
52 start_time = time.time()
Karl Zhangaff558a2020-05-15 14:28:23 +010053 print("relative_paths %s done \r\n" % relative_paths)
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010054
55 bm = TFM_Build_Manager(tfm_dir=tfm_dir,
56 work_dir=build_dir,
57 cfg_dict=build_config,
58 report=buid_report_f,
Minos Galanakisea421232019-06-20 17:11:28 +010059 parallel_builds=parallel_builds,
60 build_threads=build_threads,
61 install=build_install,
62 img_sizes=image_sizes,
63 relative_paths=relative_paths)
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010064 bm.start()
65 bm.join()
66 build_report = bm.get_report()
67 elapsed = time.time() - start_time
68 elapsed = str(datetime.timedelta(seconds=elapsed))
69 print("=============== Time Elapsed: %s ===================" % elapsed)
70 return bm.get_status(), build_report
71
72
73def main(user_args):
74 """ Main logic """
75
76 if user_args.config_f:
77 try:
78 build_config = load_json(user_args.config_f)
79 except Exception as e:
80 print("Failed to load config %s. Exception: %s" % (build_config,
81 e.msg))
82 sys.exit(1)
Minos Galanakisea421232019-06-20 17:11:28 +010083 elif user_args.config:
84 if user_args.config in _builtin_configs.keys():
85 build_config = _builtin_configs[user_args.config.lower()]
Karl Zhangaff558a2020-05-15 14:28:23 +010086 print("main %s done \r\n" % build_config)
Minos Galanakisea421232019-06-20 17:11:28 +010087 else:
88 print("Configuration %s is not defined in built-in configs" %
89 user_args.config)
90 sys.exit(1)
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010091 else:
Nicola Mazzucato935f9cb2025-05-16 17:21:07 +010092 print("Error: Configuration not specified")
Minos Galanakisea421232019-06-20 17:11:28 +010093 sys.exit(1)
94
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +010095 # Build everything
96 build_status, build_report = build(user_args.tfm_dir,
97 user_args.build_dir,
Karl Zhangaff558a2020-05-15 14:28:23 +010098 #user_args.report,
99 "summary_" + user_args.config.lower() + ".json",
Minos Galanakisea421232019-06-20 17:11:28 +0100100 build_config,
Karl Zhangaff558a2020-05-15 14:28:23 +0100101 os.cpu_count(),
Minos Galanakisea421232019-06-20 17:11:28 +0100102 user_args.thread_no,
103 user_args.install,
104 user_args.image_sizes,
105 user_args.relative_paths)
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100106
107 if not build_report:
108 print("Build Report Empty, check build status")
109 sys.exit(1)
110
111 if build_status:
112 print("Build Failed")
Minos Galanakisea421232019-06-20 17:11:28 +0100113 if user_args.eif:
114 sys.exit(1)
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100115 # pprint(build_report)
Minos Galanakisea421232019-06-20 17:11:28 +0100116 print("Build Helper Quitting!")
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100117 sys.exit(0)
118
119
120if __name__ == "__main__":
121
Minos Galanakisea421232019-06-20 17:11:28 +0100122 # Calculate the workspace root directory relative to the script location
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100123 # Equivalent to realpath $(dirname ./build_helper/build_helper.py)/../../
124 root_path = os.path.dirname(os.path.realpath(__file__))
125 for i in range(2):
126 root_path = os.path.split(root_path)[0]
127
128 parser = argparse.ArgumentParser(description="")
129 parser.add_argument("-b", "--build_dir",
130 dest="build_dir",
131 action="store",
132 default="./builds",
133 help="Where to generate the artifacts")
Minos Galanakisea421232019-06-20 17:11:28 +0100134 parser.add_argument("-c", "--config",
135 dest="config",
136 action="store",
137 help="Which of the built-in configs to run."
138 "(%s)" % "/ ".join(_builtin_configs.keys()))
139 parser.add_argument("-e", "--error_if_failed",
140 dest="eif",
141 action="store_true",
142 help="If set will change the script exit code if one "
143 "or more builds fail")
144 parser.add_argument("-f", "--config_file",
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100145 dest="config_f",
146 action="store",
147 help="Manual configuration override file (JSON)")
148 parser.add_argument("-r", "--report",
149 dest="report",
150 action="store",
151 help="JSON file containing build report")
Minos Galanakisea421232019-06-20 17:11:28 +0100152 parser.add_argument("-i", "--install",
153 dest="install",
154 action="store_true",
155 help="Run make install after building config")
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100156 parser.add_argument("-t", "--tfm_dir",
157 dest="tfm_dir",
158 action="store",
159 default=os.path.join(root_path, "tf-m"),
160 help="TFM directory")
Minos Galanakisea421232019-06-20 17:11:28 +0100161 parser.add_argument("-s", "--image-sizes",
162 dest="image_sizes",
163 action="store_true",
164 help="Run arm-none-eabi-size to axf files "
165 "generated by build")
166 parser.add_argument("-l", "--relative-paths",
167 dest="relative_paths",
168 action="store_true",
169 help="When set paths stored in report will be stored"
170 "in a relative path to the execution directory."
171 "Recommended for Jenkins Builds.")
172 parser.add_argument("-p", "--parallel-builds",
173 type=int,
174 dest="parallel_builds",
175 action="store",
176 default=3,
177 help="Number of builds jobs to run in parallel.")
178 parser.add_argument("-n", "--number-of-threads",
179 type=int,
180 dest="thread_no",
181 action="store",
182 default=3,
183 help="Number of threads to use per build job.")
Minos Galanakisf4ca6ac2017-12-11 02:39:21 +0100184 main(get_cmd_args(parser=parser))