| Index: build/android/gyp/util/build_utils.py
 | 
| diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py
 | 
| index de815e1a47b7233c200398610bc766a20520e7c4..9b74f689d6db875dc132fd92a729165ff3dfbf85 100644
 | 
| --- a/build/android/gyp/util/build_utils.py
 | 
| +++ b/build/android/gyp/util/build_utils.py
 | 
| @@ -2,6 +2,7 @@
 | 
|  # Use of this source code is governed by a BSD-style license that can be
 | 
|  # found in the LICENSE file.
 | 
|  
 | 
| +import ast
 | 
|  import contextlib
 | 
|  import fnmatch
 | 
|  import json
 | 
| @@ -14,6 +15,7 @@ import sys
 | 
|  import tempfile
 | 
|  import zipfile
 | 
|  
 | 
| +
 | 
|  CHROMIUM_SRC = os.path.normpath(
 | 
|      os.path.join(os.path.dirname(__file__),
 | 
|                   os.pardir, os.pardir, os.pardir, os.pardir))
 | 
| @@ -66,6 +68,10 @@ def FindInDirectories(directories, filename_filter):
 | 
|    return all_files
 | 
|  
 | 
|  
 | 
| +def ParseGnList(gn_string):
 | 
| +  return ast.literal_eval(gn_string)
 | 
| +
 | 
| +
 | 
|  def ParseGypList(gyp_string):
 | 
|    # The ninja generator doesn't support $ in strings, so use ## to
 | 
|    # represent $.
 | 
| @@ -73,6 +79,9 @@ def ParseGypList(gyp_string):
 | 
|    # https://code.google.com/p/gyp/issues/detail?id=327
 | 
|    # is addressed.
 | 
|    gyp_string = gyp_string.replace('##', '$')
 | 
| +
 | 
| +  if gyp_string.startswith('['):
 | 
| +    return ParseGnList(gyp_string)
 | 
|    return shlex.split(gyp_string)
 | 
|  
 | 
|  
 | 
| @@ -252,3 +261,45 @@ def WriteDepfile(path, dependencies):
 | 
|      depfile.write(': ')
 | 
|      depfile.write(' '.join(dependencies))
 | 
|      depfile.write('\n')
 | 
| +
 | 
| +
 | 
| +def ExpandFileArgs(args):
 | 
| +  """Replaces file-arg placeholders in args.
 | 
| +
 | 
| +  These placeholders have the form:
 | 
| +    @(filename:key1:key2:...:keyn)
 | 
| +
 | 
| +  The value of such a placeholder is calculated by reading 'filename' as json.
 | 
| +  And then extracting the value at [key1][key2]...[keyn].
 | 
| +
 | 
| +  Note: This intentionally does not return the list of files that appear in such
 | 
| +  placeholders. An action that uses file-args *must* know the paths of those
 | 
| +  files prior to the parsing of the arguments (typically by explicitly listing
 | 
| +  them in the action's inputs in build files).
 | 
| +  """
 | 
| +  new_args = list(args)
 | 
| +  file_jsons = dict()
 | 
| +  for i, arg in enumerate(args):
 | 
| +    start = arg.find('@(')
 | 
| +    if start < 0:
 | 
| +      continue
 | 
| +    end = arg[start:].find(')')
 | 
| +    if end < 0:
 | 
| +      continue
 | 
| +    end += start
 | 
| +
 | 
| +    if '@(' in arg[end:]:
 | 
| +      raise Exception('Only one file-lookup-expansion is allowed in each arg.')
 | 
| +
 | 
| +    lookup_path = arg[start + 2:end].split(':')
 | 
| +    file_path = lookup_path[0]
 | 
| +    if not file_path in file_jsons:
 | 
| +      file_jsons[file_path] = ReadJson(file_path)
 | 
| +
 | 
| +    expansion = file_jsons[file_path]
 | 
| +    for k in lookup_path[1:]:
 | 
| +      expansion = expansion[k]
 | 
| +
 | 
| +    new_args[i] = arg[:start] + str(expansion) + arg[end + 1:]
 | 
| +  return new_args
 | 
| +
 | 
| 
 |