Bazel exports environment variable values to apple toolchains as build
variables.

Once this change is released, client CROSSTOOLs can implement environment variables
in a feature using an env_set.

--
MOS_MIGRATED_REVID=140027562
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java
index 62467d0..2416e0f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java
@@ -13,6 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.rules.apple.cpp;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.AnalysisUtils;
@@ -44,12 +45,29 @@
   public static final String SDK_DIR_KEY = "sdk_dir";
   public static final String SDK_FRAMEWORK_DIR_KEY = "sdk_framework_dir";
   public static final String PLATFORM_DEVELOPER_FRAMEWORK_DIR = "platform_developer_framework_dir";
+  
+  @VisibleForTesting
+  public static final String XCODE_VERISON_OVERRIDE_VALUE_KEY = "xcode_version_override_value";
+  
+  @VisibleForTesting
+  public static final String APPLE_SDK_VERSION_OVERRIDE_VALUE_KEY =
+      "apple_sdk_version_override_value";
+  
+  @VisibleForTesting
+  public static final String APPLE_SDK_PLATFORM_VALUE_KEY = "apple_sdk_platform_value";
 
   @Override
   protected Map<String, String> getBuildVariables(RuleContext ruleContext) {
     AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class);
+    
+    if (!appleConfiguration.getXcodeVersion().isPresent()) {
+      ruleContext.ruleError("Xcode version must be specified to use an Apple CROSSTOOL");
+    }
+    
     Platform platform = appleConfiguration.getSingleArchPlatform();
 
+    Map<String, String> appleEnv = getEnvironment(ruleContext);
+    
     return ImmutableMap.<String, String>builder()
         .put(
             XCODE_VERSION_KEY,
@@ -76,9 +94,18 @@
         .put(
             PLATFORM_DEVELOPER_FRAMEWORK_DIR,
             AppleToolchain.platformDeveloperFrameworkDir(appleConfiguration))
+        .put(
+            XCODE_VERISON_OVERRIDE_VALUE_KEY,
+            appleEnv.getOrDefault(AppleConfiguration.XCODE_VERSION_ENV_NAME, ""))
+        .put(
+            APPLE_SDK_VERSION_OVERRIDE_VALUE_KEY,
+            appleEnv.getOrDefault(AppleConfiguration.APPLE_SDK_VERSION_ENV_NAME, ""))
+        .put(
+            APPLE_SDK_PLATFORM_VALUE_KEY,
+            appleEnv.getOrDefault(AppleConfiguration.APPLE_SDK_PLATFORM_ENV_NAME, ""))
         .build();
   }
-  
+
   @Override
   protected NestedSet<Artifact> fullInputsForLink(
       RuleContext ruleContext, NestedSet<Artifact> link) {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java
index f3d488f..c5a5629 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/LinkBuildVariablesTest.java
@@ -57,11 +57,13 @@
     return (CppLinkAction) getGeneratingAction(linkerOutput);
   }
 
-  private Variables getLinkBuildVariables(ConfiguredTarget target, Link.LinkTargetType type) {
+  /** Returns active build variables for a link action of given type for given target. */
+  protected Variables getLinkBuildVariables(ConfiguredTarget target, Link.LinkTargetType type) {
     return getCppLinkAction(target, type).getLinkCommandLine().getBuildVariables();
   }
 
-  private List<String> getVariableValue(Variables variables, String variable) throws Exception {
+  /** Returns the value of a given variable in context of the given Variables instance. */
+  protected List<String> getVariableValue(Variables variables, String variable) throws Exception {
     FeatureConfiguration mockFeatureConfiguration =
         CcToolchainFeaturesTest.buildFeatures(
                 "feature {",