diff options
author | bradnelson@chromium.org <bradnelson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-09 22:38:44 +0000 |
---|---|---|
committer | bradnelson@chromium.org <bradnelson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-09 22:38:44 +0000 |
commit | fb9a9fa42b71367b1cda5ca444cf93a3ef74cd3b (patch) | |
tree | f610f8a9b7c2b4f96d28905c77d9c830ea50f800 /site_scons/site_tools/gather_inputs.py | |
parent | 8b4b861f8ef2456c2c643032d78a17f6261fd234 (diff) | |
download | chromium_src-fb9a9fa42b71367b1cda5ca444cf93a3ef74cd3b.zip chromium_src-fb9a9fa42b71367b1cda5ca444cf93a3ef74cd3b.tar.gz chromium_src-fb9a9fa42b71367b1cda5ca444cf93a3ef74cd3b.tar.bz2 |
Dropping in software construction toolkit.
Review URL: http://codereview.chromium.org/6329
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@3145 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'site_scons/site_tools/gather_inputs.py')
-rw-r--r-- | site_scons/site_tools/gather_inputs.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/site_scons/site_tools/gather_inputs.py b/site_scons/site_tools/gather_inputs.py new file mode 100644 index 0000000..cae733a --- /dev/null +++ b/site_scons/site_tools/gather_inputs.py @@ -0,0 +1,105 @@ +#!/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. + +"""Input gathering tool for SCons.""" + + +import re +import SCons.Script + + +def GatherInputs(env, target, groups=['.*'], exclude_pattern=None): + """Find all (non-generated) input files used for a target. + + Args: + target: a target node to find source files for + For example: File('bob.exe') + groups: a list of patterns to use as categories + For example: ['.*\\.c$', '.*\\.h$'] + exclude_pattern: a pattern to exclude from the search + For example: '.*third_party.*' + Returns: + A list of lists of files for each category. + Each file will be placed in the first category which matches, + even if categories overlap. + For example: + [['bob.c', 'jim.c'], ['bob.h', 'jim.h']] + """ + + # Compile exclude pattern if any + if exclude_pattern: + exclude_pattern = re.compile(exclude_pattern) + + def _FindSources(ptrns, tgt, all): + """Internal Recursive function to find all pattern matches.""" + # Recursively process lists + if SCons.Util.is_List(tgt): + for t in tgt: + _FindSources(ptrns, t, all) + else: + # Skip if we have been here before + if tgt.abspath in all: return + # Note that we have been here + all[tgt.abspath] = True + # Skip ones that match an exclude pattern, if we have one. + if exclude_pattern and exclude_pattern.match(tgt.abspath): return + + # Handle non-leaf nodes recursively + lst = tgt.children(scan=1) + if lst: + _FindSources(ptrns, lst, all) + return + + # See who it matches + for pattern, lst in ptrns.items(): + # Get real file (backed by repositories). + rfile = tgt.rfile() + # Add to the list for the first pattern that matches. + if pattern.match(rfile.path): + lst.append(rfile.abspath) + break + + # Prepare a group for each pattern. + patterns = {} + for g in groups: + patterns[re.compile(g, re.IGNORECASE)] = [] + + # Do the search. + _FindSources(patterns, target, {}) + + return patterns.values() + + +def generate(env): + # NOTE: SCons requires the use of this name, which fails gpylint. + """SCons entry point for this tool.""" + + # Add a method to gather all inputs needed by a target. + env.AddMethod(GatherInputs, 'GatherInputs') |