blob: 57c0c16225b5291d2be3a5f4891e0129db90a6d9 [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2013 The ChromiumOS Authors
Simon Glass02741682013-05-26 07:07:58 -07002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""crosfw - Chrome OS Firmware build/flash script.
6
7Builds a firmware image for any board and writes it to the board. The image
8can be pure upstream or include Chrome OS components (-V). Some device
9tree parameters can be provided, including silent console (-C) and secure
10boot (-S). Use -i for a faster incremental build. The image is written to
11the board by default using USB/em100 (or sdcard with -x). Use -b to specify
12the board to build. Options can be added to ~/.crosfwrc - see the script for
13details.
14
15It can also flash SPI by writing a 'magic flasher' U-Boot with a payload
16to the board.
17
Simon Glass02741682013-05-26 07:07:58 -070018The script is normally run from within the U-Boot directory which is
19.../src/third_party/u-boot/files
20
21Example 1: Build upstream image for coreboot and write to a 'link':
22
Simon Glass77cc6ea2023-02-12 08:04:43 -070023 crosfw link
Simon Glass02741682013-05-26 07:07:58 -070024
Simon Glass77cc6ea2023-02-12 08:04:43 -070025Example 2: Build verified boot image (V) for daisy/snow.
Simon Glass02741682013-05-26 07:07:58 -070026
Simon Glass77cc6ea2023-02-12 08:04:43 -070027 crosfw daisy -V
Simon Glass02741682013-05-26 07:07:58 -070028
Simon Glass77cc6ea2023-02-12 08:04:43 -070029You can force a reconfigure with -f and a full distclean with -F.
Simon Glass02741682013-05-26 07:07:58 -070030
Simon Glass77cc6ea2023-02-12 08:04:43 -070031To increase verbosity use the -v and --debug options.
Simon Glass02741682013-05-26 07:07:58 -070032
Simon Glass77cc6ea2023-02-12 08:04:43 -070033This script does not use an ebuild. It does a similar thing to the
Simon Glass02741682013-05-26 07:07:58 -070034chromeos-u-boot ebuild, and runs cros_bundle_firmware to produce various
35types of image, a little like the chromeos-bootimage ebuild.
36
37The purpose of this script is to make it easier and faster to perform
38common firmware build tasks without changing boards, manually updating
39device tree files or lots of USE flags and complexity in the ebuilds.
40
41This script has been tested with snow, link and peach_pit. It builds for
42peach_pit by default. Note that it will also build any upstream ARM
Simon Glass77cc6ea2023-02-12 08:04:43 -070043board - e.g. "snapper9260" will build an image for that board.
Simon Glass02741682013-05-26 07:07:58 -070044
45Mostly you can use the script inside and outside the chroot. The main
46limitation is that dut-control doesn't really work outside the chroot,
47so writing the image to the board over USB is not possible, nor can the
48board be automatically reset on x86 platforms.
49
50For an incremental build (faster), run with -i
51
52To get faster clean builds, install ccache, and create ~/.crosfwrc with
53this line:
54
Simon Glass6ddc7f12013-07-18 15:22:41 -060055 USE_CCACHE = True
Simon Glass02741682013-05-26 07:07:58 -070056
57(make sure ~/.ccache is not on NFS, or set CCACHE_DIR)
58
59Other options are the default board to build, and verbosity (0-4), e.g.:
60
Simon Glass6ddc7f12013-07-18 15:22:41 -060061 DEFAULT_BOARD = 'daisy'
62 VERBOSE = 1
Simon Glass02741682013-05-26 07:07:58 -070063
64It is possible to use multiple servo boards, each on its own port. Add
65these lines to your ~/.crosfwrc to set the servo port to use for each
66board:
67
68 SERVO_PORT['link'] = 8888
69 SERVO_PORT['daisy'] = 9999
70 SERVO_PORT['peach_pit'] = 7777
71
Simon Glassb89ae892013-07-18 15:23:35 -060072All builds appear in the <outdir>/<board> subdirectory and images are written
73to <outdir>/<uboard>/out, where <uboard> is the U-Boot name for the board (in
74the U-Boot boards.cfg file)
75
76The value for <outdir> defaults to /tmp/crosfw but can be configured in your
77~/.crosfwrc file, e.g.:"
78
79 OUT_DIR = '/tmp/u-boot'
Simon Glass02741682013-05-26 07:07:58 -070080
81For the -a option here are some useful options:
82
83--add-blob cros-splash /dev/null
84--gbb-flags -force-dev-switch-on
85--add-node-enable /spi@131b0000/cros-ecp@0 1
86--verify --full-erase
87--bootcmd "cros_test sha"
88--gbb-flags -force-dev-switch-on
Mike Frysinger0246c1f2021-12-14 01:17:17 -050089--bmpblk ~/chromiumos/src/third_party/u-boot/bmp.bin
Simon Glass02741682013-05-26 07:07:58 -070090
91For example: -a "--gbb-flags -force-dev-switch-on"
92
93Note the standard bmpblk is at:
Mike Frysinger0246c1f2021-12-14 01:17:17 -050094 ~/chromiumos/src/third_party/chromiumos-overlay/sys-boot/
95 chromeos-bootimage/files/bmpblk.bin
Simon Glass02741682013-05-26 07:07:58 -070096"""
97
98import glob
Chris McDonald59650c32021-07-20 15:29:28 -060099import logging
Simon Glass02741682013-05-26 07:07:58 -0700100import multiprocessing
101import os
102import re
Mike Frysinger66d32cd2019-12-17 14:55:29 -0500103import subprocess
Simon Glass02741682013-05-26 07:07:58 -0700104import sys
105
Simon Glass02741682013-05-26 07:07:58 -0700106from chromite.lib import commandline
Chris McDonald59650c32021-07-20 15:29:28 -0600107from chromite.lib import constants
Simon Glass02741682013-05-26 07:07:58 -0700108from chromite.lib import cros_build_lib
109from chromite.lib import osutils
110from chromite.lib import parallel
111
112
113arch = None
114board = None
115compiler = None
116default_board = None
117family = None
118in_chroot = True
119
Alex Klein1699fab2022-09-08 08:46:06 -0600120kwargs = {
121 "print_cmd": False,
122 "check": False,
Simon Glassdee7d6b2023-02-10 11:35:18 -0700123 "encoding": "utf-8",
Alex Klein1699fab2022-09-08 08:46:06 -0600124}
Simon Glass02741682013-05-26 07:07:58 -0700125
Alex Klein1699fab2022-09-08 08:46:06 -0600126outdir = ""
Simon Glass02741682013-05-26 07:07:58 -0700127
Alex Klein1699fab2022-09-08 08:46:06 -0600128# If you have multiple boards connected on different servo ports, put lines
Simon Glass02741682013-05-26 07:07:58 -0700129# like 'SERVO_PORT{"peach_pit"} = 7777' in your ~/.crosfwrc
130SERVO_PORT = {}
131
132smdk = None
Alex Klein1699fab2022-09-08 08:46:06 -0600133src_root = os.path.join(constants.SOURCE_ROOT, "src")
Simon Glass02741682013-05-26 07:07:58 -0700134in_chroot = cros_build_lib.IsInsideChroot()
135
Alex Klein1699fab2022-09-08 08:46:06 -0600136uboard = ""
Simon Glass02741682013-05-26 07:07:58 -0700137
Alex Klein1699fab2022-09-08 08:46:06 -0600138default_board = "peach_pit"
Simon Glass02741682013-05-26 07:07:58 -0700139use_ccache = False
140vendor = None
Simon Glass02741682013-05-26 07:07:58 -0700141
142# Special cases for the U-Boot board config, the SOCs and default device tree
143# since the naming is not always consistent.
144# x86 has a lot of boards, but to U-Boot they are all the same
145UBOARDS = {
Alex Klein1699fab2022-09-08 08:46:06 -0600146 "daisy": "smdk5250",
147 "peach": "smdk5420",
Simon Glass02741682013-05-26 07:07:58 -0700148}
Alex Klein1699fab2022-09-08 08:46:06 -0600149for b in [
150 "alex",
151 "butterfly",
152 "emeraldlake2",
153 "link",
154 "lumpy",
155 "parrot",
156 "stout",
157 "stumpy",
158]:
159 UBOARDS[b] = "coreboot-x86"
160 UBOARDS["chromeos_%s" % b] = "chromeos_coreboot"
Simon Glass02741682013-05-26 07:07:58 -0700161
162SOCS = {
Alex Klein1699fab2022-09-08 08:46:06 -0600163 "coreboot-x86": "",
164 "chromeos_coreboot": "",
165 "daisy": "exynos5250-",
166 "peach": "exynos5420-",
Simon Glass02741682013-05-26 07:07:58 -0700167}
168
169DEFAULT_DTS = {
Alex Klein1699fab2022-09-08 08:46:06 -0600170 "daisy": "snow",
171 "daisy_spring": "spring",
172 "peach_pit": "peach-pit",
Simon Glass02741682013-05-26 07:07:58 -0700173}
174
Alex Klein1699fab2022-09-08 08:46:06 -0600175OUT_DIR = "/tmp/crosfw"
Simon Glassb89ae892013-07-18 15:23:35 -0600176
Alex Klein1699fab2022-09-08 08:46:06 -0600177rc_file = os.path.expanduser("~/.crosfwrc")
Simon Glass02741682013-05-26 07:07:58 -0700178if os.path.exists(rc_file):
Alex Klein1699fab2022-09-08 08:46:06 -0600179 with open(rc_file) as fp:
180 # pylint: disable=exec-used
181 exec(compile(fp.read(), rc_file, "exec"))
Simon Glass02741682013-05-26 07:07:58 -0700182
183
Simon Glass02741682013-05-26 07:07:58 -0700184def Dumper(flag, infile, outfile):
Alex Klein1699fab2022-09-08 08:46:06 -0600185 """Run objdump on an input file.
Simon Glass02741682013-05-26 07:07:58 -0700186
Alex Klein1699fab2022-09-08 08:46:06 -0600187 Args:
188 flag: Flag to pass objdump (e.g. '-d').
189 infile: Input file to process.
190 outfile: Output file to write to.
191 """
192 result = cros_build_lib.run(
193 [CompilerTool("objdump"), flag, infile], stdout=outfile, **kwargs
194 )
195 if result.returncode:
196 sys.exit()
Simon Glass02741682013-05-26 07:07:58 -0700197
198
199def CompilerTool(tool):
Alex Klein1699fab2022-09-08 08:46:06 -0600200 """Returns the cross-compiler tool filename.
Simon Glass02741682013-05-26 07:07:58 -0700201
Alex Klein1699fab2022-09-08 08:46:06 -0600202 Args:
203 tool: Tool name to return, e.g. 'size'.
Simon Glass02741682013-05-26 07:07:58 -0700204
Alex Klein1699fab2022-09-08 08:46:06 -0600205 Returns:
206 Filename of requested tool.
207 """
208 return "%s%s" % (compiler, tool)
Simon Glass02741682013-05-26 07:07:58 -0700209
210
211def ParseCmdline(argv):
Alex Klein1699fab2022-09-08 08:46:06 -0600212 """Parse all command line options.
Simon Glass02741682013-05-26 07:07:58 -0700213
Alex Klein1699fab2022-09-08 08:46:06 -0600214 Args:
215 argv: Arguments to parse.
Simon Glass02741682013-05-26 07:07:58 -0700216
Alex Klein1699fab2022-09-08 08:46:06 -0600217 Returns:
218 The parsed options object
219 """
Simon Glass95a316d2023-02-10 11:31:47 -0700220 parser = commandline.ArgumentParser(
221 description=__doc__, default_log_level="notice"
222 )
Alex Klein1699fab2022-09-08 08:46:06 -0600223 parser.add_argument(
Alex Klein1699fab2022-09-08 08:46:06 -0600224 "-B",
225 "--build",
226 action="store_false",
227 default=True,
228 help="Don't build U-Boot, just configure device tree",
229 )
230 parser.add_argument(
Alex Klein1699fab2022-09-08 08:46:06 -0600231 "-d",
232 "--dt",
233 default="seaboard",
234 help="Select name of device tree file to use",
235 )
236 parser.add_argument(
Simon Glass77cc6ea2023-02-12 08:04:43 -0700237 "-f",
238 "--force-reconfig",
Alex Klein1699fab2022-09-08 08:46:06 -0600239 action="store_true",
240 default=False,
Simon Glass77cc6ea2023-02-12 08:04:43 -0700241 help="Reconfigure before building",
242 )
243 parser.add_argument(
244 "-F",
245 "--force-distclean",
246 action="store_true",
247 default=False,
248 help="Run distclean and reconfigure before building",
Alex Klein1699fab2022-09-08 08:46:06 -0600249 )
250 parser.add_argument(
Alex Klein1699fab2022-09-08 08:46:06 -0600251 "-O",
252 "--objdump",
253 action="store_true",
254 default=False,
255 help="Write disassembly output",
256 )
257 parser.add_argument(
Alex Klein1699fab2022-09-08 08:46:06 -0600258 "-t",
259 "--trace",
260 action="store_true",
261 default=False,
262 help="Enable trace support",
263 )
264 parser.add_argument(
Simon Glassa68488c2023-02-09 16:53:47 -0700265 "-T",
266 "--target",
267 nargs="?",
268 default="all",
269 help="Select target to build",
270 )
271 parser.add_argument(
Alex Klein1699fab2022-09-08 08:46:06 -0600272 "-V",
273 "--verified",
274 action="store_true",
275 default=False,
276 help="Include Chrome OS verified boot components",
277 )
278 parser.add_argument(
Alex Klein1699fab2022-09-08 08:46:06 -0600279 "-z",
280 "--size",
281 action="store_true",
282 default=False,
283 help="Display U-Boot image size",
284 )
285 parser.add_argument(
Simon Glassa68488c2023-02-09 16:53:47 -0700286 "board",
287 type=str,
288 default=default_board,
289 help="Select board to build (daisy/peach_pit/link)",
Alex Klein1699fab2022-09-08 08:46:06 -0600290 )
291 return parser.parse_args(argv)
Simon Glass02741682013-05-26 07:07:58 -0700292
293
Simon Glassc1a323a2016-08-04 20:29:51 -0600294def FindCompiler(gcc, cros_prefix):
Alex Klein1699fab2022-09-08 08:46:06 -0600295 """Look up the compiler for an architecture.
Simon Glassc1a323a2016-08-04 20:29:51 -0600296
Alex Klein1699fab2022-09-08 08:46:06 -0600297 Args:
298 gcc: GCC architecture, either 'arm' or 'aarch64'
299 cros_prefix: Full Chromium OS toolchain prefix
300 """
301 if in_chroot:
302 # Use the Chromium OS toolchain.
303 prefix = cros_prefix
304 else:
305 prefix = glob.glob("/opt/linaro/gcc-linaro-%s-linux-*/bin/*gcc" % gcc)
306 if not prefix:
307 cros_build_lib.Die(
308 """Please install an %s toolchain for your machine.
Simon Glassc1a323a2016-08-04 20:29:51 -0600309Install a Linaro toolchain from:
310https://launchpad.net/linaro-toolchain-binaries
Alex Klein1699fab2022-09-08 08:46:06 -0600311or see cros/commands/cros_chrome_sdk.py."""
312 % gcc
313 )
314 prefix = re.sub("gcc$", "", prefix[0])
315 return prefix
Simon Glassc1a323a2016-08-04 20:29:51 -0600316
317
Simon Glass02741682013-05-26 07:07:58 -0700318def SetupBuild(options):
Alex Klein1699fab2022-09-08 08:46:06 -0600319 """Set up parameters needed for the build.
Simon Glass02741682013-05-26 07:07:58 -0700320
Alex Klein1699fab2022-09-08 08:46:06 -0600321 This checks the current environment and options and sets up various things
322 needed for the build, including 'base' which holds the base flags for
323 passing to the U-Boot Makefile.
Simon Glass02741682013-05-26 07:07:58 -0700324
Alex Klein1699fab2022-09-08 08:46:06 -0600325 Args:
326 options: Command line options
Simon Glass02741682013-05-26 07:07:58 -0700327
Alex Klein1699fab2022-09-08 08:46:06 -0600328 Returns:
329 Base flags to use for U-Boot, as a list.
330 """
331 # pylint: disable=global-statement
Simon Glass95a316d2023-02-10 11:31:47 -0700332 global arch, board, compiler, family, outdir, smdk, uboard, vendor
Simon Glass02741682013-05-26 07:07:58 -0700333
Simon Glass9674afc2023-02-10 11:21:30 -0700334 logging.info("Building for %s", options.board)
Simon Glass02741682013-05-26 07:07:58 -0700335
Alex Klein1699fab2022-09-08 08:46:06 -0600336 # Separate out board_variant string: "peach_pit" becomes "peach", "pit".
337 # But don't mess up upstream boards which use _ in their name.
338 parts = options.board.split("_")
339 if parts[0] in ["daisy", "peach"]:
340 board = parts[0]
Simon Glass02741682013-05-26 07:07:58 -0700341 else:
Alex Klein1699fab2022-09-08 08:46:06 -0600342 board = options.board
Simon Glass02741682013-05-26 07:07:58 -0700343
Alex Klein1699fab2022-09-08 08:46:06 -0600344 # To allow this to be run from 'cros_sdk'
345 if in_chroot:
346 os.chdir(os.path.join(src_root, "third_party", "u-boot", "files"))
Simon Glass02741682013-05-26 07:07:58 -0700347
Alex Klein1699fab2022-09-08 08:46:06 -0600348 base_board = board
Simon Glass02741682013-05-26 07:07:58 -0700349
Alex Klein1699fab2022-09-08 08:46:06 -0600350 if options.verified:
351 base_board = "chromeos_%s" % base_board
Simon Glass02741682013-05-26 07:07:58 -0700352
Alex Klein1699fab2022-09-08 08:46:06 -0600353 uboard = UBOARDS.get(base_board, base_board)
Simon Glass9674afc2023-02-10 11:21:30 -0700354 logging.info("U-Boot board is %s", uboard)
Simon Glass02741682013-05-26 07:07:58 -0700355
Alex Klein1699fab2022-09-08 08:46:06 -0600356 # Pull out some information from the U-Boot boards config file
357 family = None
358 (PRE_KBUILD, PRE_KCONFIG, KCONFIG) = range(3)
359 if os.path.exists("MAINTAINERS"):
360 board_format = PRE_KBUILD
361 else:
362 board_format = PRE_KCONFIG
363 with open("boards.cfg") as f:
364 for line in f:
365 if "genboardscfg" in line:
366 board_format = KCONFIG
367 if uboard in line:
368 if line[0] == "#":
369 continue
370 fields = line.split()
371 if not fields:
372 continue
Simon Glassa44a1f92023-02-09 16:31:34 -0700373 target = fields[6]
374 # Make sure this is the right target.
375 if target != uboard:
376 continue
Alex Klein1699fab2022-09-08 08:46:06 -0600377 arch = fields[1]
378 fields += [None, None, None]
379 if board_format == PRE_KBUILD:
380 smdk = fields[3]
381 vendor = fields[4]
382 family = fields[5]
Alex Klein1699fab2022-09-08 08:46:06 -0600383 elif board_format in (PRE_KCONFIG, KCONFIG):
384 smdk = fields[5]
385 vendor = fields[4]
386 family = fields[3]
387 target = fields[0]
Alex Klein1699fab2022-09-08 08:46:06 -0600388 if not arch:
389 cros_build_lib.Die(
390 "Selected board '%s' not found in boards.cfg." % board
391 )
Simon Glass02741682013-05-26 07:07:58 -0700392
Alex Klein1699fab2022-09-08 08:46:06 -0600393 vboot = os.path.join("build", board, "usr")
Simon Glassa44a1f92023-02-09 16:31:34 -0700394 if in_chroot:
395 if arch == "x86":
396 compiler = "i686-cros-linux-gnu-"
397 elif arch == "arm":
398 compiler = FindCompiler(arch, "armv7a-cros-linux-gnueabihf-")
399 elif arch == "aarch64":
400 compiler = FindCompiler(arch, "aarch64-cros-linux-gnu-")
Alex Klein1699fab2022-09-08 08:46:06 -0600401 elif arch == "sandbox":
402 compiler = ""
403 else:
Simon Glassa44a1f92023-02-09 16:31:34 -0700404 result = cros_build_lib.run(
405 ["buildman", "-A", "--boards", options.board],
406 capture_output=True,
Simon Glassa44a1f92023-02-09 16:31:34 -0700407 **kwargs,
408 )
409 compiler = result.stdout.strip()
410 if not compiler:
411 cros_build_lib.Die("Selected arch '%s' not supported.", arch)
Simon Glass02741682013-05-26 07:07:58 -0700412
Alex Klein1699fab2022-09-08 08:46:06 -0600413 cpus = multiprocessing.cpu_count()
Simon Glass02741682013-05-26 07:07:58 -0700414
Alex Klein1699fab2022-09-08 08:46:06 -0600415 outdir = os.path.join(OUT_DIR, uboard)
416 base = [
417 "make",
418 "-j%d" % cpus,
419 "O=%s" % outdir,
420 "ARCH=%s" % arch,
421 "CROSS_COMPILE=%s" % compiler,
422 "--no-print-directory",
423 "HOSTSTRIP=true",
424 "DEV_TREE_SRC=%s-%s" % (family, options.dt),
425 "QEMU_ARCH=",
426 ]
Simon Glass02741682013-05-26 07:07:58 -0700427
Simon Glass95a316d2023-02-10 11:31:47 -0700428 # Enable quiet output at INFO level, everything at DEBUG level
429 if logging.getLogger().getEffectiveLevel() <= logging.DEBUG:
Alex Klein1699fab2022-09-08 08:46:06 -0600430 base.append("V=1")
Simon Glass95a316d2023-02-10 11:31:47 -0700431 elif logging.getLogger().getEffectiveLevel() >= logging.NOTICE:
432 base.append("-s")
Simon Glass02741682013-05-26 07:07:58 -0700433
Alex Klein1699fab2022-09-08 08:46:06 -0600434 if options.verified:
435 base += [
436 "VBOOT=%s" % vboot,
437 "MAKEFLAGS_VBOOT=DEBUG=1",
438 "QUIET=1",
439 "CFLAGS_EXTRA_VBOOT=-DUNROLL_LOOPS",
440 "VBOOT_SOURCE=%s/platform/vboot_reference" % src_root,
441 ]
442 base.append("VBOOT_DEBUG=1")
443
Alex Klein1699fab2022-09-08 08:46:06 -0600444 base.append("BUILD_ROM=1")
445 if options.trace:
446 base.append("FTRACE=1")
Alex Klein1699fab2022-09-08 08:46:06 -0600447
Simon Glass77cc6ea2023-02-12 08:04:43 -0700448 if not options.force_reconfig:
Alex Klein1699fab2022-09-08 08:46:06 -0600449 config_mk = "%s/include/autoconf.mk" % outdir
450 if not os.path.exists(config_mk):
Simon Glass77cc6ea2023-02-12 08:04:43 -0700451 logging.warning("No build found for %s - adding -f", board)
452 options.force_reconfig = True
Alex Klein1699fab2022-09-08 08:46:06 -0600453
454 config_mk = "include/autoconf.mk"
455 if os.path.exists(config_mk):
456 logging.warning("Warning: '%s' exists, try 'make distclean'", config_mk)
457
Alex Klein1699fab2022-09-08 08:46:06 -0600458 return base
Simon Glass02741682013-05-26 07:07:58 -0700459
460
461def RunBuild(options, base, target, queue):
Alex Klein1699fab2022-09-08 08:46:06 -0600462 """Run the U-Boot build.
Simon Glass02741682013-05-26 07:07:58 -0700463
Alex Klein1699fab2022-09-08 08:46:06 -0600464 Args:
465 options: Command line options.
466 base: Base U-Boot flags.
467 target: Target to build.
468 queue: A parallel queue to add jobs to.
469 """
Simon Glass9674afc2023-02-10 11:21:30 -0700470 logging.info("U-Boot build flags: %s", " ".join(base))
Simon Glass02741682013-05-26 07:07:58 -0700471
Simon Glass77cc6ea2023-02-12 08:04:43 -0700472 if options.force_distclean:
473 options.force_reconfig = True
Alex Klein1699fab2022-09-08 08:46:06 -0600474 # Ignore any error from this, some older U-Boots fail on this.
Simon Glassdee7d6b2023-02-10 11:35:18 -0700475 cros_build_lib.run(base + ["distclean"], capture_output=True, **kwargs)
Simon Glass77cc6ea2023-02-12 08:04:43 -0700476
477 # Reconfigure U-Boot.
478 if options.force_reconfig:
Alex Klein1699fab2022-09-08 08:46:06 -0600479 if os.path.exists("tools/genboardscfg.py"):
480 mtarget = "defconfig"
481 else:
482 mtarget = "config"
483 cmd = base + ["%s_%s" % (uboard, mtarget)]
484 result = cros_build_lib.run(
485 cmd, stdout=True, stderr=subprocess.STDOUT, **kwargs
486 )
Simon Glassdee7d6b2023-02-10 11:35:18 -0700487 if (
488 result.returncode
489 or logging.getLogger().getEffectiveLevel() <= logging.DEBUG
490 ):
491 print(f"cmd: {result.cmdstr}")
492 print(result.stdout, file=sys.stderr)
493 if result.returncode:
494 sys.exit(result.returncode)
Simon Glass02741682013-05-26 07:07:58 -0700495
Alex Klein1699fab2022-09-08 08:46:06 -0600496 # Do the actual build.
497 if options.build:
498 result = cros_build_lib.run(
499 base + [target], stdout=True, stderr=subprocess.STDOUT, **kwargs
500 )
Simon Glassdee7d6b2023-02-10 11:35:18 -0700501 if (
502 result.returncode
503 or logging.getLogger().getEffectiveLevel() <= logging.INFO
504 ):
Alex Klein1699fab2022-09-08 08:46:06 -0600505 # The build failed, so output the results to stderr.
Simon Glassdee7d6b2023-02-10 11:35:18 -0700506 print(f"cmd: {result.cmdstr}")
507 print(result.stdout, file=sys.stderr)
508 if result.returncode:
509 sys.exit(result.returncode)
Simon Glass02741682013-05-26 07:07:58 -0700510
Alex Klein1699fab2022-09-08 08:46:06 -0600511 files = ["%s/u-boot" % outdir]
512 spl = glob.glob("%s/spl/u-boot-spl" % outdir)
513 if spl:
514 files += spl
515 if options.size:
516 result = cros_build_lib.run([CompilerTool("size")] + files, **kwargs)
517 if result.returncode:
518 sys.exit()
Simon Glass02741682013-05-26 07:07:58 -0700519
Alex Klein1699fab2022-09-08 08:46:06 -0600520 # Create disassembly files .dis and .Dis (full dump)
521 for f in files:
522 base = os.path.splitext(f)[0]
523 if options.objdump:
524 queue.put(("-d", f, base + ".dis"))
525 queue.put(("-D", f, base + ".Dis"))
526 else:
527 # Remove old files which otherwise might be confusing
528 osutils.SafeUnlink(base + ".dis")
529 osutils.SafeUnlink(base + ".Dis")
Simon Glass02741682013-05-26 07:07:58 -0700530
Simon Glass9674afc2023-02-10 11:21:30 -0700531 logging.info("Output directory %s", outdir)
Simon Glass02741682013-05-26 07:07:58 -0700532
533
Simon Glass02741682013-05-26 07:07:58 -0700534def main(argv):
Simon Glasse6201d72023-02-09 16:42:22 -0700535 """Main function for script to build firmware.
Simon Glass02741682013-05-26 07:07:58 -0700536
Alex Klein1699fab2022-09-08 08:46:06 -0600537 Args:
538 argv: Program arguments.
539 """
540 options = ParseCmdline(argv)
541 base = SetupBuild(options)
Simon Glass02741682013-05-26 07:07:58 -0700542
Alex Klein1699fab2022-09-08 08:46:06 -0600543 with parallel.BackgroundTaskRunner(Dumper) as queue:
544 RunBuild(options, base, options.target, queue)
Simon Glass02741682013-05-26 07:07:58 -0700545
Alex Klein1699fab2022-09-08 08:46:06 -0600546 if options.objdump:
Simon Glass9674afc2023-02-10 11:21:30 -0700547 logging.info("Writing diasssembly files")