cargo2android.py: Support cargo_pkg_version flag.
This parses a module's Cargo.toml file for package version number,
setting it to cargo_pkg_version. Also sets cargo_env_compat true by
default.
Bug: 171011485
Test: generated Android.bp includes cargo_env_compat, cargo_pkg_version.
Change-Id: Ibb8021633719650e2021b90806374a5d3c6a161a
diff --git a/scripts/cargo2android.py b/scripts/cargo2android.py
index f6ab3ac..11b7010 100755
--- a/scripts/cargo2android.py
+++ b/scripts/cargo2android.py
@@ -227,6 +227,8 @@
self.emit_list = '' # e.g., --emit=dep-info,metadata,link
self.edition = '2015' # rustc default, e.g., --edition=2018
self.target = '' # follows --target
+ self.cargo_env_compat = True
+ self.cargo_pkg_version = '' # value extracted from Cargo.toml version field
def write(self, s):
# convenient way to output one line at a time with EOL.
@@ -429,6 +431,20 @@
# Write to Android.bp in the subdirectory with Cargo.toml.
self.outf_name = self.cargo_dir + '/Android.bp'
self.main_src = self.main_src[len(self.cargo_dir) + 1:]
+
+ # get the package version from running cargo metadata
+ cargo_metadata = subprocess.run(["cargo", "metadata", "--no-deps"],
+ cwd=os.path.abspath(self.cargo_dir), capture_output=True)
+ if cargo_metadata.returncode:
+ self.errors += ("ERROR: unable to get cargo metadata for package version; return code " +
+ cargo_metadata.returncode + "\n")
+ else:
+ metadata_json = json.loads(cargo_metadata.stdout)
+ if len(metadata_json["packages"]) > 1:
+ self.errors += "ERROR: multiple packages defined, will not output package version"
+ else:
+ self.cargo_pkg_version = metadata_json["packages"][0]["version"]
+
else:
self.errors += 'ERROR: unknown ' + arg + '\n'
i += 1
@@ -817,6 +833,9 @@
self.write(' host_supported: true,')
if not self.defaults:
self.write(' crate_name: "' + self.crate_name + '",')
+ if not self.defaults and self.cargo_env_compat:
+ self.write(' cargo_env_compat: true,')
+ self.write(' cargo_pkg_version: "' + self.cargo_pkg_version + '",')
if not self.default_srcs:
self.dump_srcs_list()
if 'test' in self.crate_types and not self.defaults: