Index: site_scons/site_tools/component_targets.py |
=================================================================== |
--- site_scons/site_tools/component_targets.py (revision 12583) |
+++ site_scons/site_tools/component_targets.py (working copy) |
@@ -1,269 +0,0 @@ |
-#!/usr/bin/python2.4 |
-# Copyright 2008, Google Inc. |
-# All rights reserved. |
-# |
-# Redistribution and use in source and binary forms, with or without |
-# modification, are permitted provided that the following conditions are |
-# met: |
-# |
-# * Redistributions of source code must retain the above copyright |
-# notice, this list of conditions and the following disclaimer. |
-# * Redistributions in binary form must reproduce the above |
-# copyright notice, this list of conditions and the following disclaimer |
-# in the documentation and/or other materials provided with the |
-# distribution. |
-# * Neither the name of Google Inc. nor the names of its |
-# contributors may be used to endorse or promote products derived from |
-# this software without specific prior written permission. |
-# |
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- |
-"""Software construction toolkit target management for SCons.""" |
- |
- |
-import __builtin__ |
-import SCons.Script |
- |
- |
-# Dict of target groups (TargetGroup indexed by group name) |
-__target_groups = {} |
- |
-# Dict of targets (Target indexed by target name) |
-__targets = {} |
- |
-# Dict of target modes (TargetMode indexed by mode name) |
-__target_modes = {} |
- |
-#------------------------------------------------------------------------------ |
- |
- |
-class TargetGroup(object): |
- """Target group, as used by AddTargetGroup() and GetTargetGroups().""" |
- |
- def __init__(self, name, description): |
- """Initializes the target group. |
- |
- Args: |
- name: Name of the target group. |
- description: Description of group. |
- """ |
- self.name = name |
- self.description = description |
- |
- def GetTargetNames(self): |
- """Returns a list of target name strings for the group.""" |
- items = map(str, SCons.Script.Alias(self.name)[0].sources) |
- # Remove duplicates from multiple environments |
- return list(set(items)) |
- |
-#------------------------------------------------------------------------------ |
- |
- |
-class TargetMode(object): |
- """Target mode, as used by GetTargetModes().""" |
- |
- def __init__(self, name, description): |
- """Initializes the target mode. |
- |
- Args: |
- name: Name of the target mode. |
- description: Description of mode. |
- """ |
- self.name = name |
- self.description = description |
- |
- def GetTargetNames(self): |
- """Returns a list of target name strings for the group.""" |
- items = map(str, SCons.Script.Alias(self.name)[0].sources) |
- # Remove duplicates from multiple environments |
- return list(set(items)) |
- |
-#------------------------------------------------------------------------------ |
- |
- |
-class Target(object): |
- """Target object.""" |
- |
- def __init__(self, name): |
- """Initializes the target. |
- |
- Args: |
- name: Name of the target. |
- """ |
- self.name = name |
- self.properties = {} # Global properties |
- self.mode_properties = {} # Dict of modes to mode-specific properties |
- |
-#------------------------------------------------------------------------------ |
- |
- |
-def AddTargetGroup(name, description): |
- """Adds a target group, used for printing help. |
- |
- Args: |
- name: Name of target group. This should be the name of an alias which |
- points to other aliases for the specific targets. |
- description: Description of the target group. Should read properly when |
- appended to 'The following ' - for example, 'programs can be built'. |
- """ |
- |
- # Warn if the target group already exists with a different description |
- if (name in __target_groups |
- and __target_groups[name].description != description): |
- print ('Warning: Changing description of target group "%s" from "%s" to ' |
- '"%s"' % (name, __target_groups[name].description, description)) |
- __target_groups[name].description = description |
- else: |
- __target_groups[name] = TargetGroup(name, description) |
- |
- |
-def GetTargetGroups(): |
- """Gets the dict of target groups. |
- |
- Returns: |
- The dict of target groups, indexed by group name. |
- |
- This dict is not fully populated until after BuildEnvironments() has been |
- called. |
- """ |
- return __target_groups |
- |
- |
-def GetTargetModes(): |
- """Gets the dict of target modes. |
- |
- Returns: |
- The dict of target modes, indexed by mode name. |
- |
- This dict is not fully populated until after BuildEnvironments() has been |
- called. |
- """ |
- # TODO(rspangler): Better to rename this to # GetTargetBuildEnvironments()? |
- # That's a more description name. |
- return __target_modes |
- |
- |
-def GetTargets(): |
- """Gets the dict of targets. |
- |
- Returns: |
- The dict of targets, indexed by target name. |
- |
- This dict is not fully populated until after BuildEnvironments() has been |
- called. |
- """ |
- return __targets |
- |
- |
-def SetTargetProperty(self, target_name, all_modes=False, **kwargs): |
- """Sets one or more properties for a target. |
- |
- Args: |
- self: Environment context. |
- target_name: Name of the target. |
- all_modes: If True, property applies to all modes. If false, it applies |
- only to the current mode (determined by self['BUILD_TYPE']). |
- kwargs: Keyword args are used to set properties. Properties will be |
- converted to strings via env.subst(). |
- |
- For example: |
- foo_test = env.Program(...)[0] |
- env.SetTargetProperty('foo_test', global=True, DESCRIPTION='Foo test') |
- env.SetTargetProperty('foo_test', EXE=foo_test) |
- """ |
- # Get the target |
- if target_name not in __targets: |
- __targets[target_name] = Target(target_name) |
- target = __targets[target_name] |
- |
- if all_modes: |
- add_to_dict = target.properties |
- else: |
- mode = self.get('BUILD_TYPE') |
- if mode not in target.mode_properties: |
- target.mode_properties[mode] = {} |
- add_to_dict = target.mode_properties[mode] |
- |
- # Add values |
- for k, v in kwargs.items(): |
- add_to_dict[k] = self.subst(str(v)) |
- |
- |
-def AddTargetHelp(): |
- """Adds SCons help for the targets, groups, and modes. |
- |
- This is called automatically by BuildEnvironments().""" |
- help_text = '' |
- |
- for group in GetTargetGroups().values(): |
- items = group.GetTargetNames() |
- items.sort() |
- if items: |
- help_text += '\nThe following %s:' % group.description |
- colwidth = max(map(len, items)) + 2 |
- cols = 77 / colwidth |
- if cols < 1: |
- cols = 1 # If target names are really long, one per line |
- rows = (len(items) + cols - 1) / cols |
- for row in range(0, rows): |
- help_text += '\n ' |
- for i in range(row, len(items), rows): |
- help_text += '%-*s' % (colwidth, items[i]) |
- help_text += '\n %s (do all of the above)\n' % group.name |
- |
- SCons.Script.Help(help_text) |
- |
- |
-def SetTargetDescription(self, target_name, description): |
- """Convenience function to set a target's global DESCRIPTION property. |
- |
- Args: |
- self: Environment context. |
- target_name: Name of the target. |
- description: Description of the target. |
- """ |
- self.SetTargetProperty(target_name, all_modes=True, DESCRIPTION=description) |
- |
- |
-def AddTargetMode(env): |
- """Adds the environment as a target mode. |
- |
- Args: |
- env: Environment context. |
- |
- Called via env.Defer() for each build mode. |
- """ |
- # Save the build mode and description |
- mode = env.get('BUILD_TYPE') |
- __target_modes[mode] = TargetMode(mode, env.get('BUILD_TYPE_DESCRIPTION')) |
- |
- |
-#------------------------------------------------------------------------------ |
- |
- |
-def generate(env): |
- # NOTE: SCons requires the use of this name, which fails gpylint. |
- """SCons entry point for this tool.""" |
- env = env # Silence gpylint |
- |
- __builtin__.AddTargetGroup = AddTargetGroup |
- __builtin__.AddTargetHelp = AddTargetHelp |
- __builtin__.GetTargetGroups = GetTargetGroups |
- __builtin__.GetTargetModes = GetTargetModes |
- __builtin__.GetTargets = GetTargets |
- |
- env.AddMethod(SetTargetDescription) |
- env.AddMethod(SetTargetProperty) |
- |
- # Defer per-mode setup |
- env.Defer(AddTargetMode) |