Merge changes I68f8d670,I122fd6bf,Iae1668a4,Ib31a0170,I56275f90, ...

* changes:
  gn2bp: add helper function to rebase relative dirs
  gn2bp: add location tag helper
  gn2bp: ensure there are not multiple occurences of arg
  gn2bp: add write_buildflag_header support to ActionSanitizer
  gn2bp: move parameter sanitization to ActionSanitizer
  gn2bp: add basic outline of ActionSanitizer with helpers
This commit is contained in:
Mohannad Farrag
2022-11-30 14:03:30 +00:00
committed by Gerrit Code Review

View File

@@ -29,6 +29,7 @@ import argparse
import collections import collections
import json import json
import logging as log import logging as log
import operator
import os import os
import re import re
import sys import sys
@@ -617,6 +618,64 @@ def create_proto_group_modules(blueprint, gn, module_name, target_names):
blueprint.add_module(module) blueprint.add_module(module)
class ActionSanitizer():
def __init__(self, target):
# Just to be on the safe side, create a deep-copy.
self.target = copy.deepcopy(target)
# Convert ['--param=value'] to ['--param', 'value'] for consistency.
self.target.args = [str for it in target.args for str in it.split('=')]
def _has_arg(self, arg):
return arg in self.target.args
# Whether an arg has multiple occurences (see argparse action='append')
def _is_append_arg(self, arg):
return operator.countOf(arg, self.target.args) > 1
def _has_arg_value(self, arg):
# TODO: we'll probably need a set of helper functions to deal with append
# args as well.
assert(not self._is_append_arg(arg))
i = self.target.args.index(arg)
return not self.target.args[i + 1].startswith('--')
def _get_arg_value(self, arg):
assert(self._has_arg_value(arg))
i = self.target.args.index(arg)
return self.target.args[i + 1]
def _set_arg_value(self, arg, value):
assert(self._has_arg_value(arg))
i = self.target.args.index(arg)
self.target.args[i + 1] = value
def _delete_arg(self, arg):
assert(not self._is_append_arg(arg))
hasValue = self._has_arg_value(arg)
i = self.target.index(arg)
self.target.args.pop(i)
if hasValue:
self.target.args.pop(i)
# wrap filename in location tag.
def _location_tag(self, filename):
return '$(location %s)' % filename
# deletes the leading ../../
def _rebase_directory(self, filename):
filename = re.sub('^\.\./\.\./', '', filename)
def get_args(self):
if self.target.script == "//build/write_buildflag_header.py":
# write_buildflag_header.py writes result to args.genDir/args.output
# So, override args.genDir by '.' so that args.output=$(out) works
self._set_arg_value('--gen-dir', '.')
self._set_arg_value('--output', '$(out)')
return self.target.args
def create_action_foreach_modules(blueprint, target): def create_action_foreach_modules(blueprint, target):
""" The following assumes that rebase_path exists in the args. """ The following assumes that rebase_path exists in the args.
The args of an action_foreach contains hints about which output files are generated The args of an action_foreach contains hints about which output files are generated
@@ -654,21 +713,10 @@ def create_action_module(blueprint, target):
bp_module_name = label_to_module_name(target.name) bp_module_name = label_to_module_name(target.name)
module = Module('cc_genrule', bp_module_name, target.name) module = Module('cc_genrule', bp_module_name, target.name)
# Convert ['--param=value'] to ['--param', 'value'] for consistency. sanitizer = ActionSanitizer(target)
# TODO: we may want to only do this for python scripts arguments. If argparse target.args = sanitizer.get_args()
# is used, this transformation is safe.
target.args = [str for it in target.args for str in it.split('=')]
if target.script == "//build/write_buildflag_header.py": if target.script == '//build/write_build_date_header.py':
# write_buildflag_header.py writes result to args.genDir/args.output
# So, override args.genDir by '.' so that args.output=$(out) works
for i, val in enumerate(target.args):
if val == '--gen-dir':
target.args[i + 1] = '.'
elif val == '--output':
target.args[i + 1] = '$(out)'
elif target.script == '//build/write_build_date_header.py':
target.args[0] = '$(out)' target.args[0] = '$(out)'
elif target.script == '//base/android/jni_generator/jni_generator.py': elif target.script == '//base/android/jni_generator/jni_generator.py':