Merge changes I119583b6,I00ae8f7d,I1b4033ae,I133dfdd7,Idc7a2ed2, ...

* changes:
  gn2bp: Move arg output from get_outputs to _sanitize_outputs
  gn2bp: Move arg sanitizing from get_args to _sanitize_args
  gn2bp: Add sanitize API to the BaseActionSanitizer
  gn2bp: Update is_header_generated in the BaseActionSanitizer
  gn2bp: Update is_header_generated of MakeDafsaSanitizer
  gn2bp: Add MakeDafsaSanitizer
  gn2bp: Add is_header_generated to the BaseActionSanitizer
  gn2bp: Remove unrequired hack for action_with_pydeps
  gn2bp: Use the result of get_outputs as module.out
  gn2bp: Add get_outputs to JniGeneratorSanitizer
  gn2bp: Fix to use set for target.outputs
  gn2bp: Add get_outputs to the BaseActionSanitizer
  gn2bp: Fix arg normalization and remove hack in the VersionSanitizer
  gn2bp: Normalize args by for loop instead of comprehension
  gn2bp: Update the comment for value args and list args
  gn2bp: Update _is_value_arg
This commit is contained in:
Mohannad Farrag
2022-12-02 12:06:03 +00:00
committed by Gerrit Code Review
2 changed files with 66 additions and 54 deletions

View File

@@ -7844,7 +7844,7 @@ java_genrule {
"-f " +
"$(location build/util/LASTCHANGE) " +
"-e " +
"API_LEVEL='20' " +
"API_LEVEL=20 " +
"-o " +
"$(out) " +
"$(location components/cronet/android/java/src/org/chromium/net/impl/ImplVersion.template)",
@@ -7885,7 +7885,7 @@ java_genrule {
"-f " +
"$(location build/util/LASTCHANGE) " +
"-e " +
"API_LEVEL='20' " +
"API_LEVEL=20 " +
"-o " +
"$(out) " +
"$(location components/cronet/android/api/src/org/chromium/net/ApiVersion.template)",
@@ -8264,7 +8264,7 @@ cc_genrule {
cmd: "$(location build/util/version.py) -f " +
"$(location chrome/VERSION) " +
"-e " +
"VERSION_FULL='\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH)' " +
"VERSION_FULL=\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH) " +
"-o " +
"$(out) " +
"$(location components/cronet/version.h.in)",
@@ -8289,7 +8289,7 @@ cc_genrule {
cmd: "$(location build/util/version.py) -f " +
"$(location chrome/VERSION) " +
"-e " +
"VERSION_FULL='\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH)' " +
"VERSION_FULL=\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH) " +
"-o " +
"$(out) " +
"$(location components/cronet/version.h.in)",
@@ -8314,7 +8314,7 @@ cc_genrule {
cmd: "$(location build/util/version.py) -f " +
"$(location chrome/VERSION) " +
"-e " +
"VERSION_FULL='\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH)' " +
"VERSION_FULL=\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH) " +
"-o " +
"$(out) " +
"$(location components/cronet/version.h.in)",
@@ -8339,7 +8339,7 @@ cc_genrule {
cmd: "$(location build/util/version.py) -f " +
"$(location chrome/VERSION) " +
"-e " +
"VERSION_FULL='\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH)' " +
"VERSION_FULL=\"%s.%s.%s.%s\" % (MAJOR,MINOR,BUILD,PATCH) " +
"-o " +
"$(out) " +
"$(location components/cronet/version.h.in)",

View File

@@ -620,17 +620,25 @@ class BaseActionSanitizer():
def __init__(self, target):
# Just to be on the safe side, create a deep-copy.
self.target = copy.deepcopy(target)
self.target.args = self._normalize_args()
def _normalize_args(self):
# Convert ['--param=value'] to ['--param', 'value'] for consistency.
self.target.args = [str for it in self.target.args for str in it.split('=')]
normalized_args = []
for arg in self.target.args:
if arg.startswith('-'):
normalized_args.extend(arg.split('='))
else:
normalized_args.append(arg)
return normalized_args
# There are three types of args:
# - flags (--flag)
# - value args (--arg value)
# - list args (--arg value1 --arg value2)
# value args have exactly one arg value pair and list args have one or more arg value pairs.
# Note that the set of list args contains the set of value args.
# value args must have exactly one arg value pair but list args could have one arg value pair.
# This is because list args with one arg value pair and value args can not be distinguished only
# from the desc.json
# This is because list and value args are identical when the list args has only one arg value pair
# Some functions provide special implementations for each type, while others
# work on all of them.
def _has_arg(self, arg):
@@ -654,10 +662,7 @@ class BaseActionSanitizer():
# Whether an arg value pair appears exactly once
def _is_value_arg(self, arg):
if operator.countOf(self.target.args, arg) != 1:
return False
i = self.target.args.index(arg)
return not self.target.args[i + 1].startswith('--')
return operator.countOf(self.target.args, arg) == 1 and self._is_list_arg(arg)
def _get_value_arg(self, arg):
assert(self._is_value_arg(arg))
@@ -723,16 +728,33 @@ class BaseActionSanitizer():
def get_args(self):
return self.target.args
def get_outputs(self):
return self.target.outputs
def _sanitize_args(self):
pass
def _sanitize_outputs(self):
pass
def sanitize(self):
self._sanitize_args()
self._sanitize_outputs()
# Whether this target generates header files
def is_header_generated(self):
return any(os.path.splitext(it)[1] == '.h' for it in self.target.outputs)
class WriteBuildDateHeaderSanitizer(BaseActionSanitizer):
def get_args(self):
def _sanitize_args(self):
self._set_arg_at(0, '$(out)')
return super().get_args()
super()._sanitize_args()
class WriteBuildFlagHeaderSanitizer(BaseActionSanitizer):
def get_args(self):
def _sanitize_args(self):
self._set_value_arg('--gen-dir', '.')
self._set_value_arg('--output', '$(out)')
return super().get_args()
super()._sanitize_args()
class JniGeneratorSanitizer(BaseActionSanitizer):
def _add_location_tag_to_filepath(self, arg):
@@ -742,7 +764,7 @@ class JniGeneratorSanitizer(BaseActionSanitizer):
arg = self._add_location_tag(arg)
return arg
def get_args(self):
def _sanitize_args(self):
self._update_value_arg('--jar_file', self._sanitize_filepath, False)
self._update_value_arg('--jar_file', self._add_location_tag, False)
if self._has_arg('--jar_file'):
@@ -752,10 +774,15 @@ class JniGeneratorSanitizer(BaseActionSanitizer):
self._delete_value_arg('--prev_output_dir', False)
self._update_list_arg('--input_file', self._sanitize_filepath)
self._update_list_arg('--input_file', self._add_location_tag_to_filepath)
return super().get_args()
super()._sanitize_args()
def _sanitize_outputs(self):
# fix target.output directory to match #include statements.
self.target.outputs = {re.sub('^jni_headers/', '', out) for out in self.target.outputs}
super()._sanitize_outputs()
class JniRegistrationGeneratorSanitizer(BaseActionSanitizer):
def get_args(self):
def _sanitize_args(self):
self._update_value_arg('--depfile', self._sanitize_filepath)
self._update_value_arg('--srcjar-path', self._sanitize_filepath)
self._update_value_arg('--header-path', self._sanitize_filepath)
@@ -763,32 +790,28 @@ class JniRegistrationGeneratorSanitizer(BaseActionSanitizer):
# update_jni_registration_module removes them from the srcs of the module
# It might be better to remove sources by '--sources-exclusions'
self._delete_value_arg('--sources-exclusions')
return super().get_args()
super()._sanitize_args()
class VersionSanitizer(BaseActionSanitizer):
def _sanitize_eval(self):
assert (self._is_value_arg('-e'))
# arg for -e EVAL option should be passed in -e PATCH_HI=int(PATCH)//256 format.
index = self.target.args.index('-e')
value = '%s=\'%s\'' % (self.target.args[index + 1], self.target.args[index + 2])
# escape '"' in the value
value = value.replace('"', r'\"')
self._set_arg_at(index + 1, value)
self.target.args.pop(index + 2)
def get_args(self):
def _sanitize_args(self):
self._set_value_arg('-o', '$(out)')
# args for the version.py contain file path without leading --arg key. So apply sanitize
# function for all the args.
self._update_all_args(self._sanitize_filepath_with_location_tag)
self._sanitize_eval()
return super().get_args()
self._update_value_arg('-e', lambda arg: arg.replace('"', r'\"'))
super()._sanitize_args()
class JavaCppEnumSanitizer(BaseActionSanitizer):
def get_args(self):
def _sanitize_args(self):
self._update_all_args(self._sanitize_filepath_with_location_tag)
self._set_value_arg('--srcjar', '$(out)')
return super().get_args()
super()._sanitize_args()
class MakeDafsaSanitizer(BaseActionSanitizer):
def is_header_generated(self):
# This script generates .cc files but they are #included by other sources
# (e.g. registry_controlled_domain.cc)
return True
def get_action_sanitizer(target):
if target.script == "//build/write_buildflag_header.py":
@@ -803,6 +826,8 @@ def get_action_sanitizer(target):
return VersionSanitizer(target)
elif target.script == "//build/android/gyp/java_cpp_enum.py":
return JavaCppEnumSanitizer(target)
elif target.script == "//net/tools/dafsa/make_dafsa.py":
return MakeDafsaSanitizer(target)
else:
# TODO: throw exception here once all script hacks have been converted.
return BaseActionSanitizer(target)
@@ -845,12 +870,13 @@ def create_action_module(blueprint, target, type):
module = Module(type, bp_module_name, target.name)
sanitizer = get_action_sanitizer(target)
sanitizer.sanitize()
target.args = sanitizer.get_args()
module.out = sanitizer.get_outputs()
if sanitizer.is_header_generated():
module.genrule_headers.add(module.name)
if target.script == '//base/android/jni_generator/jni_generator.py':
# fix target.output directory to match #include statements.
target.outputs = [re.sub('^jni_headers/', '', out) for out in target.outputs]
# android_jar.classes should be part of the tools as it list implicit classes
# for the script to generate JNI headers.
module.tool_files.add("base/android/jni_generator/android_jar.classes")
@@ -862,10 +888,6 @@ def create_action_module(blueprint, target, type):
target.deps.clear()
target.inputs = [file for file in target.inputs if not file.startswith('//out/')]
elif target.script == "//net/tools/dafsa/make_dafsa.py":
# This script generates .cc files but source (registry_controlled_domain.cc) in the target that
# depends on this target includes .cc file this script generates.
module.genrule_headers.add(module.name)
elif target.script == "//build/util/version.py":
# android_chrome_version.py is not specified in anywhere but version.py imports this file
module.tool_files.add('build/util/android_chrome_version.py')
@@ -890,9 +912,6 @@ def create_action_module(blueprint, target, type):
# Pipe response file contents into script
module.cmd = 'echo \'%s\' |%s%s' % (target.response_file_contents, NEWLINE, module.cmd)
if any(os.path.splitext(it)[1] == '.h' for it in target.outputs):
module.genrule_headers.add(bp_module_name)
# gn treats inputs and sources for actions equally.
# soong only supports source files inside srcs, non-source files are added as
# tool_files dependency.
@@ -902,13 +921,6 @@ def create_action_module(blueprint, target, type):
else:
module.tool_files.add(gn_utils.label_to_path(it))
# Actions using template "action_with_pydeps" also put script inside inputs.
# TODO: it might make sense to filter inputs inside GnParser.
if script in module.srcs:
module.srcs.remove(script)
module.out.update(target.outputs)
if target.script == '//base/android/jni_generator/jni_registration_generator.py':
# jni_registration_generator.py doesn't work with python2
module.cmd = "python3 " + module.cmd