blob: c4b629304a02d49c7b1118cd707fcd590028fa45 [file] [log] [blame]
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A module for the prepare command."""
import cr
class PrepareCommand(cr.Command):
"""The implementation of the prepare command.
The prepare command is used to perform the steps needed to get an output
directory ready to use. These should not be the kind of things that need to
happen every time you build something, but the rarer things that you re-do
only when you get or add new source files, or change your build options.
This delegates all it's behavior to implementations of PrepareOut. These will
(mostly) be in the cr.actions package.
"""
def __init__(self):
super(PrepareCommand, self).__init__()
self.help = 'Prepares an output directory'
self.description = ("""
This does any preparation needed for the output directory, such as
running gn.
""")
def Run(self):
self.Prepare()
@classmethod
def UpdateContext(cls):
PrepareOut.GetActivePlugin().UpdateContext()
@classmethod
def Prepare(cls):
cls.UpdateContext()
PrepareOut.GetActivePlugin().Prepare()
class PrepareOut(cr.Plugin, cr.Plugin.Type):
"""Base class for output directory preparation plugins.
See PrepareCommand for details.
"""
SELECTOR = 'CR_GENERATOR'
@classmethod
def AddArguments(cls, parser):
parser.add_argument(
'--generator', dest=cls.SELECTOR,
choices=cls.Choices(),
default=None,
help=('Sets the build file generator to use. ' +
'Overrides %s.' % cls.SELECTOR)
)
def UpdateContext(self):
"""Update the context if needed.
This is also used by commands that want the environment setup correctly, but
are not going to call Prepare directly (such as sync)."""
def Prepare(self):
"""All PrepareOut plugins must override this method to do their work."""
raise NotImplementedError('Must be overridden.')