Pass extraneous environment variables to build scripts (#362)

cargo-raze has `buildrs_additional_environment_variables` which allows
extraneous environment variable to be passed to the build script. In addition
this should enable for everybody to add the environment variables that are
not added by the `cargo_build_script` rule itself.

That's the rules_rust side of the fix for google/cargo-raze#179.
diff --git a/cargo/cargo_build_script.bzl b/cargo/cargo_build_script.bzl
index 00b738a..c879e5d 100644
--- a/cargo/cargo_build_script.bzl
+++ b/cargo/cargo_build_script.bzl
@@ -57,6 +57,8 @@
     for f in ctx.attr.crate_features:
         env["CARGO_FEATURE_" + f.upper().replace("-", "_")] = "1"
 
+    env.update(ctx.attr.build_script_env)
+
     tools = depset(
         direct = [
             script,
@@ -113,6 +115,9 @@
             cfg = "host",
             doc = "The binary script to run, generally a rust_binary target. ",
         ),
+        "build_script_env": attr.string_dict(
+            doc = "Environment variables for build scripts.",
+        ),
         "crate_name": attr.string(),
         "crate_features": attr.string_list(doc = "The list of rust features that the build script should consider activated."),
         "_cc_toolchain": attr.label(default = Label("@bazel_tools//tools/cpp:current_cc_toolchain")),
@@ -131,7 +136,12 @@
     ],
 )
 
-def cargo_build_script(name, crate_name = "", crate_features = [], deps = [], **kwargs):
+def cargo_build_script(name,
+                       crate_name = "",
+                       crate_features = [],
+                       deps = [],
+                       build_script_env = {},
+                       **kwargs):
     """
     Compile and execute a rust build script to generate build attributes
 
@@ -166,6 +176,8 @@
         srcs = ["build.rs"],
         # Data are shipped during execution.
         data = ["src/lib.rs"],
+        # Environment variables passed during build.rs execution
+        build_script_env = {"CARGO_PKG_VERSION": "0.1.2"},
     )
 
     rust_library(
@@ -191,5 +203,6 @@
         script = ":%s_script_" % name,
         crate_name = crate_name,
         crate_features = crate_features,
+        build_script_env = build_script_env,
         deps = deps,
     )
diff --git a/docs/cargo_build_script.md b/docs/cargo_build_script.md
index 1dd6cb4..cffa514 100644
--- a/docs/cargo_build_script.md
+++ b/docs/cargo_build_script.md
@@ -6,7 +6,7 @@
 ## cargo_build_script
 
 <pre>
-cargo_build_script(<a href="#cargo_build_script-name">name</a>, <a href="#cargo_build_script-crate_name">crate_name</a>, <a href="#cargo_build_script-crate_features">crate_features</a>, <a href="#cargo_build_script-deps">deps</a>, <a href="#cargo_build_script-kwargs">kwargs</a>)
+cargo_build_script(<a href="#cargo_build_script-name">name</a>, <a href="#cargo_build_script-crate_name">crate_name</a>, <a href="#cargo_build_script-crate_features">crate_features</a>, <a href="#cargo_build_script-deps">deps</a>, <a href="#cargo_build_script-build_script_env">build_script_env</a>, <a href="#cargo_build_script-kwargs">kwargs</a>)
 </pre>
 
     Compile and execute a rust build script to generate build attributes
@@ -42,6 +42,8 @@
     srcs = ["build.rs"],
     # Data are shipped during execution.
     data = ["src/lib.rs"],
+    # Environment variables passed during build.rs execution
+    build_script_env = {"CARGO_PKG_VERSION": "0.1.2"},
 )
 
 rust_library(
@@ -65,6 +67,7 @@
 | <a id="cargo_build_script-crate_name"></a>crate_name |  <p align="center"> - </p>   |  <code>""</code> |
 | <a id="cargo_build_script-crate_features"></a>crate_features |  <p align="center"> - </p>   |  <code>[]</code> |
 | <a id="cargo_build_script-deps"></a>deps |  <p align="center"> - </p>   |  <code>[]</code> |
+| <a id="cargo_build_script-build_script_env"></a>build_script_env |  <p align="center"> - </p>   |  <code>{}</code> |
 | <a id="cargo_build_script-kwargs"></a>kwargs |  <p align="center"> - </p>   |  none |
 
 
diff --git a/docs/flatten.md b/docs/flatten.md
index 8797b67..f597fc8 100644
--- a/docs/flatten.md
+++ b/docs/flatten.md
@@ -823,7 +823,7 @@
 ## cargo_build_script
 
 <pre>
-cargo_build_script(<a href="#cargo_build_script-name">name</a>, <a href="#cargo_build_script-crate_name">crate_name</a>, <a href="#cargo_build_script-crate_features">crate_features</a>, <a href="#cargo_build_script-deps">deps</a>, <a href="#cargo_build_script-kwargs">kwargs</a>)
+cargo_build_script(<a href="#cargo_build_script-name">name</a>, <a href="#cargo_build_script-crate_name">crate_name</a>, <a href="#cargo_build_script-crate_features">crate_features</a>, <a href="#cargo_build_script-deps">deps</a>, <a href="#cargo_build_script-build_script_env">build_script_env</a>, <a href="#cargo_build_script-kwargs">kwargs</a>)
 </pre>
 
     Compile and execute a rust build script to generate build attributes
@@ -859,6 +859,8 @@
     srcs = ["build.rs"],
     # Data are shipped during execution.
     data = ["src/lib.rs"],
+    # Environment variables passed during build.rs execution
+    build_script_env = {"CARGO_PKG_VERSION": "0.1.2"},
 )
 
 rust_library(
@@ -882,6 +884,7 @@
 | <a id="cargo_build_script-crate_name"></a>crate_name |  <p align="center"> - </p>   |  <code>""</code> |
 | <a id="cargo_build_script-crate_features"></a>crate_features |  <p align="center"> - </p>   |  <code>[]</code> |
 | <a id="cargo_build_script-deps"></a>deps |  <p align="center"> - </p>   |  <code>[]</code> |
+| <a id="cargo_build_script-build_script_env"></a>build_script_env |  <p align="center"> - </p>   |  <code>{}</code> |
 | <a id="cargo_build_script-kwargs"></a>kwargs |  <p align="center"> - </p>   |  none |
 
 
diff --git a/examples/cargo/BUILD b/examples/cargo/BUILD
index 6949638..d168faf 100644
--- a/examples/cargo/BUILD
+++ b/examples/cargo/BUILD
@@ -14,6 +14,7 @@
     srcs = ["build_script.rs"],
     data = ["test.txt"],
     crate_features = ["bleh"],
+    build_script_env = {"SOME_ENV": "42"},
 )
 
 rust_library(
diff --git a/examples/cargo/build_script.rs b/examples/cargo/build_script.rs
index 6c325fe..f54b1a7 100644
--- a/examples/cargo/build_script.rs
+++ b/examples/cargo/build_script.rs
@@ -17,9 +17,11 @@
 
 fn main() {
     let bleh = env::var("CARGO_FEATURE_BLEH").unwrap();
+    let some_env = env::var("SOME_ENV").unwrap();
     let out_dir = env::var("OUT_DIR").unwrap();
     let data = std::fs::read("cargo/test.txt").unwrap();
     assert!(!bleh.is_empty());
+    assert_eq!(some_env, "42");
     println!(r#"cargo:rustc-env=FOO=BAR
 cargo:rustc-env=BAR=FOO
 cargo:rustc-flags=--cfg=blah="bleh"