blob: f380d3b8289b82cc049bdd65049bb61b2b3fc55b [file] [log] [blame]
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""cros brick: Create and manage bricks."""
from __future__ import print_function
import os
from chromite.cli import command
from chromite.lib import brick_lib
from chromite.lib import cros_build_lib
@command.CommandDecorator('brick')
class BrickCommand(command.CliCommand):
"""Create and manage bricks."""
EPILOG = """
To create a brick in foo/bar:
cros brick create foo/bar
All bricks can be referred to using a locator. This locator is either:
* a relative path to the brick from the current working directory.
* the relative path to the brick in the current workspace, prefixed with '//'.
* board:<board name> for legacy, public board overlays.
To create a brick in ${workspace}/foo that depends on ${workspace}/bar:
cros brick create //foo --dependency //bar
To create a brick that depend on the gizmo overlay:
cros brick create //foo -d board:gizmo
Multiple dependencies can be specified by repeating -d/--dependency. The order
matters here. Dependencies should be ordered from the lowest priority to the
highest:
cros brick create //foo -d //bar -d //baz
"""
def __init__(self, options):
super(BrickCommand, self).__init__(options)
self.brick = options.brick
self.dependencies = options.dependencies
@classmethod
def AddParser(cls, parser):
super(cls, BrickCommand).AddParser(parser)
subparser = parser.add_subparsers()
create_parser = subparser.add_parser('create')
create_parser.add_argument('brick', help='The current brick locator.')
create_parser.add_argument('-d', '--dependency', action='append',
dest='dependencies',
help='Add a dependency to this brick. This must '
'be a brick locator.')
create_parser.set_defaults(handler_func='Create', dependencies=[])
def Create(self):
"""Create a new brick.
This will create config.json and generate portage's configuration based on
it.
"""
try:
# TODO(bsimonnet): remove the name attribute once we do the stacking
# without relying on it.
conf = {'name': os.path.basename(self.brick),
'dependencies': self.dependencies}
brick_lib.Brick(self.brick, initial_config=conf)
except brick_lib.BrickCreationFailed as e:
cros_build_lib.Die('Brick creation failed: %s' % e)
def Run(self):
"""Dispatch the call to the right handler."""
self.options.Freeze()
getattr(self, self.options.handler_func)()