Add EXCLUDED_CRATES and better default names
* protobuf_bin_gen_rust_do_not_use is in EXCLUDED_CRATES
* build_default_name returns a short and readable name
for a rust_defaults module, from the following choices:
(1) root_pkg + '_defaults',
(2) root_pkg + '_defaults_' + crate_name
(3) root_pkg + '_defaults_' + main_src_basename_path
(4) root_pkg + '_defaults_' + a_positive_sequence_number
Test: regen external/rust/crates/*/Android.bp
Change-Id: I6aa16a8a6c7ea05744a31a9d4ff0c4524ef91fea
diff --git a/scripts/cargo2android.py b/scripts/cargo2android.py
index 08f23fa..df841d9 100755
--- a/scripts/cargo2android.py
+++ b/scripts/cargo2android.py
@@ -60,6 +60,10 @@
import re
import sys
+# Some Rust packages include extra unwanted crates.
+# This set contains all such excluded crate names.
+EXCLUDED_CRATES = set(['protobuf_bin_gen_rust_do_not_use'])
+
RENAME_MAP = {
# This map includes all changes to the default rust module names
# to resolve name conflicts, avoid confusion, or work as plugin.
@@ -462,7 +466,8 @@
def skip_crate(self):
"""Return crate_name or a message if this crate should be skipped."""
- if is_build_crate_name(self.crate_name):
+ if (is_build_crate_name(self.crate_name) or
+ self.crate_name in EXCLUDED_CRATES):
return self.crate_name
if is_dependent_file_path(self.main_src):
return 'dependent crate'
@@ -531,10 +536,26 @@
self.decide_one_module_type(crate_type)
self.dump_one_android_module(crate_type)
+ def build_default_name(self):
+ """Return a short and readable name for the rust_defaults module."""
+ # Choices: (1) root_pkg + '_defaults',
+ # (2) root_pkg + '_defaults_' + crate_name
+ # (3) root_pkg + '_defaults_' + main_src_basename_path
+ # (4) root_pkg + '_defaults_' + a_positive_sequence_number
+ name1 = altered_defaults(self.root_pkg) + '_defaults'
+ if self.runner.try_claim_module_name(name1, self):
+ return name1
+ name2 = name1 + '_' + self.crate_name
+ if self.runner.try_claim_module_name(name2, self):
+ return name2
+ name3 = name1 + '_' + self.main_src_basename_path()
+ if self.runner.try_claim_module_name(name3, self):
+ return name3
+ return self.runner.claim_module_name(name1, self, 0)
+
def dump_defaults_module(self):
"""Dump a rust_defaults module to be shared by other modules."""
- name = altered_defaults(self.root_pkg) + '_defaults'
- name = self.runner.claim_module_name(name, self, 0)
+ name = self.build_default_name()
self.defaults = name
self.write('\nrust_defaults {')
self.write(' name: "' + name + '",')
@@ -618,10 +639,13 @@
self.dump_android_property_list('static_libs', '"lib%s"', self.static_libs)
self.dump_android_property_list('shared_libs', '"lib%s"', self.shared_libs)
+ def main_src_basename_path(self):
+ return re.sub('/', '_', re.sub('.rs$', '', self.main_src))
+
def test_module_name(self):
"""Return a unique name for a test module."""
# root_pkg+(_host|_device) + '_test_'+source_file_name
- suffix = re.sub('/', '_', re.sub('.rs$', '', self.main_src))
+ suffix = self.main_src_basename_path()
host_device = '_host'
if self.device_supported:
host_device = '_device'
@@ -980,16 +1004,20 @@
with open(name, 'w') as outf:
outf.write(ANDROID_BP_HEADER.format(args=' '.join(sys.argv[1:])))
+ def try_claim_module_name(self, name, owner):
+ """Reserve and return True if it has not been reserved yet."""
+ if name not in self.name_owners or owner == self.name_owners[name]:
+ self.name_owners[name] = owner
+ return True
+ return False
+
def claim_module_name(self, prefix, owner, counter):
"""Return prefix if not owned yet, otherwise, prefix+str(counter)."""
while True:
name = prefix
if counter > 0:
- name += str(counter)
- if name not in self.name_owners:
- self.name_owners[name] = owner
- return name
- if owner == self.name_owners[name]:
+ name += '_' + str(counter)
+ if self.try_claim_module_name(name, owner):
return name
counter += 1