blob: d1126b9866b9b1bcf534fc5b033df4da41f57aec [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
Alex Kleinda35fcf2019-03-07 16:01:15 -070016from chromite.lib import build_target_util
Alex Klein34581082018-12-03 12:56:53 -070017from chromite.lib import commandline
Alex Kleinda35fcf2019-03-07 16:01:15 -070018from chromite.lib import cros_build_lib
19from chromite.service import sysroot
Alex Klein34581082018-12-03 12:56:53 -070020
21
22def GetParser():
23 """Build the argument parser."""
Alex Klein6893e712019-01-16 14:43:29 -070024 # TODO(crbug.com/922144) Remove underscore separated arguments and the
25 # deprecated message after 2019-06-01.
26 deprecated = 'Argument will be removed 2019-06-01. Use %s instead.'
Alex Klein34581082018-12-03 12:56:53 -070027 parser = commandline.ArgumentParser(description=__doc__)
28
29 parser.add_argument('--board', required=True,
30 help='The name of the board to set up.')
31 parser.add_argument('--default', action='store_true', default=False,
32 help='Set the board to the default board in your chroot.')
33 parser.add_argument('--force', action='store_true', default=False,
34 help='Force re-creating the board root.')
35 # The positive and negative versions of the arguments are used.
36 # TODO(saklein) Simplify usages to a single version of the argument.
37 parser.add_argument('--usepkg', action='store_true', default=True,
38 dest='usepkg', help='Use binary packages to bootstrap.')
39 parser.add_argument('--nousepkg', action='store_false', default=True,
40 dest='usepkg', help='Use binary packages to bootstrap.')
41
42 advanced = parser.add_argument_group('Advanced Options')
Alex Klein6893e712019-01-16 14:43:29 -070043 advanced.add_argument('--accept-licenses',
Alex Klein34581082018-12-03 12:56:53 -070044 help='Licenses to append to the accept list.')
Alex Klein6893e712019-01-16 14:43:29 -070045 advanced.add_argument('--accept_licenses',
46 deprecated=deprecated % '--accept-licenses',
47 help='Deprecated form of --accept-licenses.')
Alex Klein34581082018-12-03 12:56:53 -070048
49 # Build target related arguments.
50 target = parser.add_argument_group('Advanced Build Target Options')
51 target.add_argument('--profile',
52 help='The portage configuration profile to use. Profile '
53 'must be located in overlay-board/profiles.')
54 target.add_argument('--variant', help='Board variant.')
Alex Klein6893e712019-01-16 14:43:29 -070055 target.add_argument('--board-root', type='path', help='Board root.')
56 target.add_argument('--board_root', type='path',
57 deprecated=deprecated % '--board-root',
58 help='Deprecated form of --board-root.')
Alex Klein34581082018-12-03 12:56:53 -070059
60 # Arguments related to the build itself.
61 build = parser.add_argument_group('Advanced Build Modification Options')
62 build.add_argument('--jobs', type=int,
63 help='Maximum number of packages to build in parallel.')
Alex Klein6893e712019-01-16 14:43:29 -070064 build.add_argument('--regen-configs', action='store_true', default=False,
Alex Klein34581082018-12-03 12:56:53 -070065 help='Regenerate all config files (useful for '
Alex Klein6893e712019-01-16 14:43:29 -070066 'modifying profiles without rebuild).')
67 build.add_argument('--regen_configs', action='store_true', default=False,
68 deprecated=deprecated % '--regen-configs',
69 help='Deprecated form of --regen-configs.')
Alex Klein34581082018-12-03 12:56:53 -070070 build.add_argument('--quiet', action='store_true', default=False,
71 help="Don't print warnings when board already exists.")
Alex Klein6893e712019-01-16 14:43:29 -070072 build.add_argument('--skip-toolchain-update', action='store_true',
73 default=False,
Alex Klein34581082018-12-03 12:56:53 -070074 help="Don't update toolchain automatically.")
Alex Klein6893e712019-01-16 14:43:29 -070075 build.add_argument('--skip_toolchain_update', action='store_true',
76 default=False,
77 deprecated=deprecated % '--skip-toolchain-update',
78 help='Deprecated form of --skip-toolchain-update.')
79 build.add_argument('--skip-chroot-upgrade', action='store_true',
80 default=False,
Alex Klein34581082018-12-03 12:56:53 -070081 help="Don't run the chroot upgrade automatically; "
82 'use with care.')
Alex Klein6893e712019-01-16 14:43:29 -070083 build.add_argument('--skip_chroot_upgrade', action='store_true',
84 default=False,
85 deprecated=deprecated % '--skip-chroot-upgrade',
86 help='Deprecated form of --skip-chroot-upgrade.')
87 build.add_argument('--skip-board-pkg-init', action='store_true',
88 default=False,
Alex Klein34581082018-12-03 12:56:53 -070089 help="Don't emerge any packages during setup_board into "
90 'the board root.')
Alex Klein6893e712019-01-16 14:43:29 -070091 build.add_argument('--skip_board_pkg_init', action='store_true',
92 default=False,
93 deprecated=deprecated % '--skip-board-pkg-init',
94 help='Deprecated form of --skip-board-pkg-init.')
95 build.add_argument('--reuse-pkgs-from-local-boards', dest='reuse_local',
96 action='store_true', default=False,
Alex Klein34581082018-12-03 12:56:53 -070097 help='Bootstrap from local packages instead of remote '
98 'packages.')
Alex Klein6893e712019-01-16 14:43:29 -070099 build.add_argument('--reuse_pkgs_from_local_boards', dest='reuse_local',
100 action='store_true', default=False,
101 deprecated=deprecated % '--reuse-pkgs-from-local-boards',
102 help='Deprecated form of --reuse-pkgs-from-local-boards.')
Alex Klein34581082018-12-03 12:56:53 -0700103
104 return parser
105
106
107def _ParseArgs(args):
108 """Parse and validate arguments."""
109 parser = GetParser()
110 opts = parser.parse_args(args)
111
112 # Translate raw options to config objects.
Alex Kleinda35fcf2019-03-07 16:01:15 -0700113 name = '%s_%s' % (opts.board, opts.variant) if opts.variant else opts.board
114 opts.build_target = build_target_util.BuildTarget(name,
115 build_root=opts.board_root,
116 profile=opts.profile)
Alex Klein34581082018-12-03 12:56:53 -0700117
Alex Kleinda35fcf2019-03-07 16:01:15 -0700118 opts.run_config = sysroot.SetupBoardRunConfig(
Alex Klein34581082018-12-03 12:56:53 -0700119 set_default=opts.default, force=opts.force, usepkg=opts.usepkg,
120 jobs=opts.jobs, regen_configs=opts.regen_configs, quiet=opts.quiet,
121 update_toolchain=not opts.skip_toolchain_update,
122 upgrade_chroot=not opts.skip_chroot_upgrade,
123 init_board_pkgs=not opts.skip_board_pkg_init,
124 local_build=opts.reuse_local)
125
126 opts.Freeze()
127 return opts
128
129
130def main(argv):
131 opts = _ParseArgs(argv)
Alex Kleinda35fcf2019-03-07 16:01:15 -0700132 try:
133 sysroot.SetupBoard(opts.build_target, opts.accept_licenses, opts.run_config)
134 except sysroot.Error as e:
135 cros_build_lib.Die(e.message)