From f6de33f21f80712eba45f769722585165f6f23ee Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Tue, 29 Nov 2022 22:02:55 -0800 Subject: [PATCH 1/6] gn2bp: add basic outline of ActionSanitizer with helpers The goal is to make create_action_module more readable and easier to work with. ActionSanitizer provides some basic helper functions that should make the implementation of script-specific hacks a lot more readable. Test: none Change-Id: I07772e336fb1d3879f6b50df1ea720e2a98cef72 --- tools/gn2bp/gen_android_bp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp index 466eaf4cd6..50696392e4 100755 --- a/tools/gn2bp/gen_android_bp +++ b/tools/gn2bp/gen_android_bp @@ -608,6 +608,39 @@ def create_proto_group_modules(blueprint, gn, module_name, target_names): blueprint.add_module(module) + +class ActionSanitizer(): + def __init__(self, target): + self.target = target + + def _has_arg(self, arg): + return arg in self.target.args + + def _has_arg_value(self, arg): + i = self.target.args.index(arg) + return not self.target.args[i + 1].startswith('--') + + def _get_arg_value(self, 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): + hasValue = self._has_arg_value(arg) + i = self.target.index(arg) + self.target.args.pop(i) + if hasValue: + self.target.args.pop(i) + + def get_args(self): + # TODO: implement + pass + + def create_action_foreach_modules(blueprint, target): """ The following assumes that rebase_path exists in the args. The args of an action_foreach contains hints about which output files are generated From 9e414b59fb6be4b123184304f4b3cfd731b08333 Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Tue, 29 Nov 2022 22:12:18 -0800 Subject: [PATCH 2/6] gn2bp: move parameter sanitization to ActionSanitizer Test: none Change-Id: I56275f902186266bfbbeb839f40bedad1206f938 --- tools/gn2bp/gen_android_bp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp index 50696392e4..7d04e4a879 100755 --- a/tools/gn2bp/gen_android_bp +++ b/tools/gn2bp/gen_android_bp @@ -611,7 +611,10 @@ def create_proto_group_modules(blueprint, gn, module_name, target_names): class ActionSanitizer(): def __init__(self, target): - self.target = 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 @@ -637,8 +640,7 @@ class ActionSanitizer(): self.target.args.pop(i) def get_args(self): - # TODO: implement - pass + return self.target.args def create_action_foreach_modules(blueprint, target): @@ -678,10 +680,8 @@ def create_action_module(blueprint, target): bp_module_name = label_to_module_name(target.name) module = Module('cc_genrule', bp_module_name, target.name) - # Convert ['--param=value'] to ['--param', 'value'] for consistency. - # TODO: we may want to only do this for python scripts arguments. If argparse - # is used, this transformation is safe. - target.args = [str for it in target.args for str in it.split('=')] + sanitizer = ActionSanitizer(target) + target.args = sanitizer.get_args() if target.script == "//build/write_buildflag_header.py": # write_buildflag_header.py writes result to args.genDir/args.output From 48fa74d1e4f62eddea781af5bf91bc95c6034dac Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Tue, 29 Nov 2022 22:15:29 -0800 Subject: [PATCH 3/6] gn2bp: add write_buildflag_header support to ActionSanitizer Test: none Change-Id: Ib31a0170f18e419cde2a8c4462caafff3d688292 --- tools/gn2bp/gen_android_bp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp index 7d04e4a879..5bc7bcb011 100755 --- a/tools/gn2bp/gen_android_bp +++ b/tools/gn2bp/gen_android_bp @@ -640,6 +640,12 @@ class ActionSanitizer(): self.target.args.pop(i) 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 @@ -683,16 +689,7 @@ def create_action_module(blueprint, target): sanitizer = ActionSanitizer(target) target.args = sanitizer.get_args() - if 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 - 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': + if target.script == '//build/write_build_date_header.py': target.args[0] = '$(out)' elif target.script == '//base/android/jni_generator/jni_generator.py': From 3a2c3ddc42ef57c1676c0eb4a5010f77178f2c98 Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Tue, 29 Nov 2022 22:29:36 -0800 Subject: [PATCH 4/6] gn2bp: ensure there are not multiple occurences of arg As we do not deal with this yet... Test: none Change-Id: Iae1668a4cf7441d06265c6146b8a3819df6b299c --- tools/gn2bp/gen_android_bp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp index 5bc7bcb011..6b1df3b507 100755 --- a/tools/gn2bp/gen_android_bp +++ b/tools/gn2bp/gen_android_bp @@ -29,6 +29,7 @@ import argparse import collections import json import logging as log +import operator import os import re import sys @@ -619,11 +620,19 @@ class ActionSanitizer(): 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] @@ -633,6 +642,7 @@ class ActionSanitizer(): 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) From 73ef7ae8abc65cce8f43f82aded3b96633af9dd1 Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Tue, 29 Nov 2022 22:33:09 -0800 Subject: [PATCH 5/6] gn2bp: add location tag helper This is a very common operation. Test: none Change-Id: I122fd6bfa4b7fcabc012c8e69050c241083dd8a1 --- tools/gn2bp/gen_android_bp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp index 6b1df3b507..c6dccbb84f 100755 --- a/tools/gn2bp/gen_android_bp +++ b/tools/gn2bp/gen_android_bp @@ -649,6 +649,10 @@ class ActionSanitizer(): if hasValue: self.target.args.pop(i) + # wrap filename in location tag. + def _location_tag(self, filename): + return '$(location %s)' % 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 From 3227689a59583b838748b067dd6ccc20546185b0 Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Tue, 29 Nov 2022 22:38:13 -0800 Subject: [PATCH 6/6] gn2bp: add helper function to rebase relative dirs Test: none Change-Id: I68f8d670e90c70520355c62ae1b868ce0567156a --- tools/gn2bp/gen_android_bp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/gn2bp/gen_android_bp b/tools/gn2bp/gen_android_bp index c6dccbb84f..16244bd032 100755 --- a/tools/gn2bp/gen_android_bp +++ b/tools/gn2bp/gen_android_bp @@ -653,6 +653,10 @@ class ActionSanitizer(): 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