15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""A module for the Builder base class."""
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import difflib
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import cr
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Builder(cr.Action, cr.Plugin.Type):
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Base class for implementing builders.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Builder implementations must override the Build and Clean methods at a
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  minimum to build a target and clean up back to a pristine state respectively.
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  They can also override Rebuild if they are able to handle it in a more
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  efficient way that a Clean Build sequence.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  They should override the GetTargets method to return the set of valid targets
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  the build system knows about, and override IsTarget if they can implement it
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  more efficiently than checking from presents in the result of GetTargets.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SELECTOR_ARG = '--builder'
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SELECTOR = 'CR_BUILDER'
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SELECTOR_HELP = 'Sets the builder to use to update dependencies.'
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @cr.Plugin.activemethod
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Build(self, targets, arguments):
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raise NotImplementedError('Must be overridden.')
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @cr.Plugin.activemethod
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Clean(self, targets, arguments):
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    """Clean temporary files built by a target."""
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raise NotImplementedError('Must be overridden.')
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @cr.Plugin.activemethod
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Rebuild(self, targets, arguments):
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Make a target build even if it is up to date.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    Default implementation is to do a Clean and Build sequence.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Do not call the base version if you implement a more efficient one.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Clean(targets, [])
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Build(targets, arguments)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @cr.Plugin.activemethod
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetTargets(self):
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Gets the full set of targets supported by this builder.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Used in automatic target name transformations, and also in offering the
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user choices.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return []
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @cr.Plugin.activemethod
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def IsTarget(self, target_name):
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Check if a target name is on the builder knows about."""
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return target_name in self.GetTargets()
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @cr.Plugin.activemethod
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GuessTargets(self, target_name):
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns a list of closest matching targets for a named target."""
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return difflib.get_close_matches(target_name, self.GetTargets(), 10, 0.4)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkipBuilder(Builder):
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """The "skip" version of a Builder, causes the build step to be skipped."""
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  @property
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def priority(self):
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return super(SkipBuilder, self).priority - 1
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Build(self, targets, arguments):
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Clean(self, targets, arguments):
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)