| Index: tools/BUILD_simulator.py
|
| diff --git a/tools/BUILD_simulator.py b/tools/BUILD_simulator.py
|
| index 46d3cd79e7008511d4b322b4153ef488565c5da4..bd4a832b7ba5b0e3f17798750549f9e5e0ecf203 100755
|
| --- a/tools/BUILD_simulator.py
|
| +++ b/tools/BUILD_simulator.py
|
| @@ -11,18 +11,52 @@
|
| # We start by adding some symbols to our namespace that BUILD.public calls.
|
|
|
| import glob
|
| +import os
|
| import pprint
|
| +import re
|
|
|
| def noop(*args, **kwargs):
|
| pass
|
|
|
| +DOUBLE_STAR_RE = re.compile(r'/\*\*/')
|
| +STAR_RE = re.compile(r'\*')
|
| +DOUBLE_STAR_PLACEHOLDER = "xxxdoublestarxxx"
|
| +STAR_PLACEHOLDER = "xxxstarxxx"
|
| +
|
| +# Returns a set of files that match pattern.
|
| +def BUILD_glob_single(pattern):
|
| + if pattern.find('**') < 0:
|
| + # If pattern doesn't include **, glob.glob more-or-less does the right
|
| + # thing.
|
| + return glob.glob(pattern)
|
| + # First transform pattern into a regexp.
|
| + # Temporarily remove ** and *.
|
| + pattern2 = DOUBLE_STAR_RE.sub(DOUBLE_STAR_PLACEHOLDER, pattern)
|
| + pattern3 = STAR_RE.sub(STAR_PLACEHOLDER, pattern2)
|
| + # Replace any regexp special characters.
|
| + pattern4 = re.escape(pattern3)
|
| + # Replace * with [^/]* and ** with .*.
|
| + pattern5 = pattern4.replace(STAR_PLACEHOLDER, '[^/]*')
|
| + pattern6 = pattern5.replace(DOUBLE_STAR_PLACEHOLDER, '.*/')
|
| + # Anchor the match at the beginning and end.
|
| + pattern7 = "^" + pattern6 + "$"
|
| + pattern_re = re.compile(pattern7)
|
| + matches = set()
|
| + for root, _, files in os.walk('.'):
|
| + for fname in files:
|
| + # Remove initial "./".
|
| + path = os.path.join(root, fname)[2:]
|
| + if pattern_re.match(path):
|
| + matches.add(path)
|
| + return matches
|
| +
|
| # Simulates BUILD file glob().
|
| def BUILD_glob(include, exclude=()):
|
| files = set()
|
| for pattern in include:
|
| - files.update(glob.glob(pattern))
|
| + files.update(BUILD_glob_single(pattern))
|
| for pattern in exclude:
|
| - files.difference_update(glob.glob(pattern))
|
| + files.difference_update(BUILD_glob_single(pattern))
|
| return list(sorted(files))
|
|
|
| # With these namespaces, we can treat BUILD.public as if it were
|
| @@ -30,7 +64,12 @@ def BUILD_glob(include, exclude=()):
|
| # DEFINES, etc.) into local_names.
|
| global_names = {
|
| 'exports_files': noop,
|
| + 'cc_library': noop,
|
| + 'cc_test': noop,
|
| 'glob': BUILD_glob,
|
| + 'EXTERNAL_DEPS': [],
|
| + 'BASE_DIR': "",
|
| + 'DM_EXTERNAL_DEPS': [],
|
| }
|
| local_names = {}
|
| execfile('BUILD.public', global_names, local_names)
|
|
|