blob: 85eaeccf9df8087d72da07825e6eeb3b346fa159 [file] [log] [blame]
Alex Klein34581082018-12-03 12:56:53 -07001# -*- coding: utf-8 -*-
2# Copyright 2018 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""setup_board builds the sysroot for a board.
7
8The setup_board process includes the simple directory creations, installs
9several configuration files, sets up portage command wrappers and configs,
10and installs the toolchain and some core dependency packages (e.g. kernel
11headers, gcc-libs).
12"""
13
14from __future__ import print_function
15
Mike Frysinger6a2b0f22020-02-20 13:34:07 -050016import sys
17
Alex Klein2960c752020-03-09 13:43:38 -060018from chromite.lib import build_target_lib
Alex Klein34581082018-12-03 12:56:53 -070019from chromite.lib import commandline
Alex Kleinda35fcf2019-03-07 16:01:15 -070020from chromite.lib import cros_build_lib
Mike Frysingerc14d9a02019-08-26 15:44:16 -040021from chromite.lib import portage_util
Alex Kleinda35fcf2019-03-07 16:01:15 -070022from chromite.service import sysroot
Alex Klein34581082018-12-03 12:56:53 -070023
24
Mike Frysinger6a2b0f22020-02-20 13:34:07 -050025assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
26
27
Alex Klein34581082018-12-03 12:56:53 -070028def GetParser():
29 """Build the argument parser."""
Alex Klein6893e712019-01-16 14:43:29 -070030 # TODO(crbug.com/922144) Remove underscore separated arguments and the
31 # deprecated message after 2019-06-01.
32 deprecated = 'Argument will be removed 2019-06-01. Use %s instead.'
Alex Klein34581082018-12-03 12:56:53 -070033 parser = commandline.ArgumentParser(description=__doc__)
34
35 parser.add_argument('--board', required=True,
36 help='The name of the board to set up.')
37 parser.add_argument('--default', action='store_true', default=False,
38 help='Set the board to the default board in your chroot.')
39 parser.add_argument('--force', action='store_true', default=False,
40 help='Force re-creating the board root.')
41 # The positive and negative versions of the arguments are used.
42 # TODO(saklein) Simplify usages to a single version of the argument.
43 parser.add_argument('--usepkg', action='store_true', default=True,
44 dest='usepkg', help='Use binary packages to bootstrap.')
45 parser.add_argument('--nousepkg', action='store_false', default=True,
46 dest='usepkg', help='Use binary packages to bootstrap.')
47
48 advanced = parser.add_argument_group('Advanced Options')
Alex Klein6893e712019-01-16 14:43:29 -070049 advanced.add_argument('--accept-licenses',
Alex Klein34581082018-12-03 12:56:53 -070050 help='Licenses to append to the accept list.')
Alex Klein6893e712019-01-16 14:43:29 -070051 advanced.add_argument('--accept_licenses',
52 deprecated=deprecated % '--accept-licenses',
53 help='Deprecated form of --accept-licenses.')
Alex Klein34581082018-12-03 12:56:53 -070054
55 # Build target related arguments.
56 target = parser.add_argument_group('Advanced Build Target Options')
57 target.add_argument('--profile',
58 help='The portage configuration profile to use. Profile '
59 'must be located in overlay-board/profiles.')
60 target.add_argument('--variant', help='Board variant.')
Alex Klein6893e712019-01-16 14:43:29 -070061 target.add_argument('--board-root', type='path', help='Board root.')
62 target.add_argument('--board_root', type='path',
63 deprecated=deprecated % '--board-root',
64 help='Deprecated form of --board-root.')
Alex Klein34581082018-12-03 12:56:53 -070065
66 # Arguments related to the build itself.
67 build = parser.add_argument_group('Advanced Build Modification Options')
68 build.add_argument('--jobs', type=int,
69 help='Maximum number of packages to build in parallel.')
Alex Klein6893e712019-01-16 14:43:29 -070070 build.add_argument('--regen-configs', action='store_true', default=False,
Alex Klein34581082018-12-03 12:56:53 -070071 help='Regenerate all config files (useful for '
Alex Klein6893e712019-01-16 14:43:29 -070072 'modifying profiles without rebuild).')
73 build.add_argument('--regen_configs', action='store_true', default=False,
74 deprecated=deprecated % '--regen-configs',
75 help='Deprecated form of --regen-configs.')
Alex Klein34581082018-12-03 12:56:53 -070076 build.add_argument('--quiet', action='store_true', default=False,
77 help="Don't print warnings when board already exists.")
Alex Klein6893e712019-01-16 14:43:29 -070078 build.add_argument('--skip-toolchain-update', action='store_true',
79 default=False,
Alex Klein34581082018-12-03 12:56:53 -070080 help="Don't update toolchain automatically.")
Alex Klein6893e712019-01-16 14:43:29 -070081 build.add_argument('--skip_toolchain_update', action='store_true',
82 default=False,
83 deprecated=deprecated % '--skip-toolchain-update',
84 help='Deprecated form of --skip-toolchain-update.')
85 build.add_argument('--skip-chroot-upgrade', action='store_true',
86 default=False,
Alex Klein34581082018-12-03 12:56:53 -070087 help="Don't run the chroot upgrade automatically; "
88 'use with care.')
Alex Klein6893e712019-01-16 14:43:29 -070089 build.add_argument('--skip_chroot_upgrade', action='store_true',
90 default=False,
91 deprecated=deprecated % '--skip-chroot-upgrade',
92 help='Deprecated form of --skip-chroot-upgrade.')
93 build.add_argument('--skip-board-pkg-init', action='store_true',
94 default=False,
Alex Klein34581082018-12-03 12:56:53 -070095 help="Don't emerge any packages during setup_board into "
96 'the board root.')
Alex Klein6893e712019-01-16 14:43:29 -070097 build.add_argument('--skip_board_pkg_init', action='store_true',
98 default=False,
99 deprecated=deprecated % '--skip-board-pkg-init',
100 help='Deprecated form of --skip-board-pkg-init.')
101 build.add_argument('--reuse-pkgs-from-local-boards', dest='reuse_local',
102 action='store_true', default=False,
Alex Klein34581082018-12-03 12:56:53 -0700103 help='Bootstrap from local packages instead of remote '
104 'packages.')
Alex Klein6893e712019-01-16 14:43:29 -0700105 build.add_argument('--reuse_pkgs_from_local_boards', dest='reuse_local',
106 action='store_true', default=False,
107 deprecated=deprecated % '--reuse-pkgs-from-local-boards',
108 help='Deprecated form of --reuse-pkgs-from-local-boards.')
Alex Klein34581082018-12-03 12:56:53 -0700109
110 return parser
111
112
113def _ParseArgs(args):
114 """Parse and validate arguments."""
115 parser = GetParser()
116 opts = parser.parse_args(args)
117
118 # Translate raw options to config objects.
Alex Kleinda35fcf2019-03-07 16:01:15 -0700119 name = '%s_%s' % (opts.board, opts.variant) if opts.variant else opts.board
Alex Klein2960c752020-03-09 13:43:38 -0600120 opts.build_target = build_target_lib.BuildTarget(name,
121 build_root=opts.board_root,
122 profile=opts.profile)
Alex Klein34581082018-12-03 12:56:53 -0700123
Alex Kleinda35fcf2019-03-07 16:01:15 -0700124 opts.run_config = sysroot.SetupBoardRunConfig(
Alex Klein34581082018-12-03 12:56:53 -0700125 set_default=opts.default, force=opts.force, usepkg=opts.usepkg,
126 jobs=opts.jobs, regen_configs=opts.regen_configs, quiet=opts.quiet,
127 update_toolchain=not opts.skip_toolchain_update,
128 upgrade_chroot=not opts.skip_chroot_upgrade,
129 init_board_pkgs=not opts.skip_board_pkg_init,
130 local_build=opts.reuse_local)
131
132 opts.Freeze()
133 return opts
134
135
136def main(argv):
137 opts = _ParseArgs(argv)
Alex Kleinda35fcf2019-03-07 16:01:15 -0700138 try:
139 sysroot.SetupBoard(opts.build_target, opts.accept_licenses, opts.run_config)
Mike Frysingerc14d9a02019-08-26 15:44:16 -0400140 except portage_util.MissingOverlayError as e:
141 # Add a bit more user friendly message as people can typo names easily.
142 cros_build_lib.Die(
143 '%s\n'
144 "Double check the --board setting and make sure you're syncing the "
145 'right manifest (internal-vs-external).', e)
Alex Kleinda35fcf2019-03-07 16:01:15 -0700146 except sysroot.Error as e:
Mike Frysinger6b5c3cd2019-08-27 16:51:00 -0400147 cros_build_lib.Die(e)