Add Android.bp

The upstream crate uses build.rs to capture the version of Rust. Rely on
Soong to provide this piece of information.

Test: m librustversion
Bug: 178357400
Change-Id: I85d3542eeeded85a4590c407a5055c3cc6375e33
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..9630d0c
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,9 @@
+// This file is generated by cargo2android.py --run --device --dependencies.
+// Do not modify this file as changes will be overridden on upgrade.
+
+rust_proc_macro {
+    name: "librustversion",
+    crate_name: "rustversion",
+    srcs: ["src/lib.rs"],
+    edition: "2018",
+}
diff --git a/patches/version.diff b/patches/version.diff
new file mode 100644
index 0000000..ea177f8
--- /dev/null
+++ b/patches/version.diff
@@ -0,0 +1,40 @@
+diff --git a/src/lib.rs b/src/lib.rs
+index 2614105..18d170d 100644
+--- a/src/lib.rs
++++ b/src/lib.rs
+@@ -165,7 +165,16 @@ use crate::version::Version;
+ use proc_macro::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree};
+ use std::iter::FromIterator;
+ 
+-const RUSTVERSION: Version = include!(concat!(env!("OUT_DIR"), "/version.rs"));
++// ANDROID: Soong is providing the version of rustc via an env variable.
++const ANDROID_RUSTVERSION: &str = env!("ANDROID_RUST_VERSION");
++fn rust_version() -> Version {
++    let v: Vec<&str> = ANDROID_RUSTVERSION.split('.').collect();
++    Version {
++        minor: v[1].parse().unwrap(),
++        patch: v[2].parse().unwrap(),
++        channel: version::Channel::Stable,
++    }
++}
+ 
+ #[proc_macro_attribute]
+ pub fn stable(args: TokenStream, input: TokenStream) -> TokenStream {
+@@ -226,7 +235,7 @@ fn try_cfg(introducer: &str, args: TokenStream, input: TokenStream) -> Result<To
+     let expr = expr::parse(full_args)?;
+     token::parse_end(full_args)?;
+ 
+-    if expr.eval(RUSTVERSION) {
++    if expr.eval(rust_version()) {
+         Ok(input)
+     } else {
+         Ok(TokenStream::new())
+@@ -241,7 +250,7 @@ pub fn attr(args: TokenStream, input: TokenStream) -> TokenStream {
+ }
+ 
+ fn try_attr(args: attr::Args, input: TokenStream) -> Result<TokenStream> {
+-    if !args.condition.eval(RUSTVERSION) {
++    if !args.condition.eval(rust_version()) {
+         return Ok(input);
+     }
+ 
diff --git a/src/lib.rs b/src/lib.rs
index 2614105..18d170d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -165,7 +165,16 @@
 use proc_macro::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree};
 use std::iter::FromIterator;
 
-const RUSTVERSION: Version = include!(concat!(env!("OUT_DIR"), "/version.rs"));
+// ANDROID: Soong is providing the version of rustc via an env variable.
+const ANDROID_RUSTVERSION: &str = env!("ANDROID_RUST_VERSION");
+fn rust_version() -> Version {
+    let v: Vec<&str> = ANDROID_RUSTVERSION.split('.').collect();
+    Version {
+        minor: v[1].parse().unwrap(),
+        patch: v[2].parse().unwrap(),
+        channel: version::Channel::Stable,
+    }
+}
 
 #[proc_macro_attribute]
 pub fn stable(args: TokenStream, input: TokenStream) -> TokenStream {
@@ -226,7 +235,7 @@
     let expr = expr::parse(full_args)?;
     token::parse_end(full_args)?;
 
-    if expr.eval(RUSTVERSION) {
+    if expr.eval(rust_version()) {
         Ok(input)
     } else {
         Ok(TokenStream::new())
@@ -241,7 +250,7 @@
 }
 
 fn try_attr(args: attr::Args, input: TokenStream) -> Result<TokenStream> {
-    if !args.condition.eval(RUSTVERSION) {
+    if !args.condition.eval(rust_version()) {
         return Ok(input);
     }