| #!/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. |
| |
| """Search and replace builder for SCons.""" |
| |
| |
| import re |
| import SCons.Script |
| |
| |
| def ReplaceStrings(target, source, env): |
| """Replace Strings builder, does regex substitution on files. |
| |
| Args: |
| target: A single target file node. |
| source: A single input file node. |
| env: Environment in which to build. |
| |
| From env: |
| REPLACE_STRINGS: A list of pairs of regex search and replacement strings. |
| The body of the source file has substitution performed on each |
| pair (search_regex, replacement) in order. SCons variables in the |
| replacement strings will be evaluated. |
| |
| Returns: |
| The target node, a file with contents from source, with the substitutions |
| from REPLACE_STRINGS performed on it. |
| |
| For example: |
| env.ReplaceStrings('out', 'in', |
| REPLACE_STRINGS = [('a*', 'b'), ('b', 'CCC')]) |
| With 'in' having contents: Haaapy. |
| Outputs: HCCCpy. |
| """ |
| # Load text. |
| fh = open(source[0].abspath, 'rb') |
| text = fh.read() |
| fh.close() |
| # Do replacements. |
| for r in env['REPLACE_STRINGS']: |
| text = re.sub(r[0], env.subst(r[1]), text) |
| # Write it out. |
| fh = open(target[0].abspath, 'wb') |
| fh.write(text) |
| fh.close() |
| |
| |
| def generate(env): |
| # NOTE: SCons requires the use of this name, which fails gpylint. |
| """SCons entry point for this tool.""" |
| |
| # Add the builder |
| act = SCons.Script.Action(ReplaceStrings, varlist=['REPLACE_STRINGS']) |
| bld = SCons.Script.Builder(action=act, single_source=True) |
| env.Append(BUILDERS={'ReplaceStrings': bld}) |