Add //external:has_androidsdk config_setting.

This will be used to add some tests and targets to the Bazel codebase that build and run successfully when android_sdk_repository is in the WORKSPACE and silently skip if it is not.

Example deps of a library that links against dx.jar:

```
deps = select({
    "//external:has_androidsdk": ["//external:android/dx_jar_import"],
    "//conditions:default": [],
}),
```

Also adds tests that config_setting works as expected when propagated through an alias or bind rule.

RELNOTES: None
PiperOrigin-RevId: 157627472
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java
index 45948f5..ba0f237 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryRule.java
@@ -48,6 +48,9 @@
           builder.put(
               "android/dx_jar_import", Label.parseAbsoluteUnchecked(prefix + "dx_jar_import"));
           builder.put("android_sdk_for_testing", Label.parseAbsoluteUnchecked(prefix + "files"));
+          builder.put(
+              "has_androidsdk",
+              Label.parseAbsoluteUnchecked("@bazel_tools//tools/android:always_true"));
           return builder.build();
         }
       };
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android.WORKSPACE b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android.WORKSPACE
index 51fdfef..ed2ea23 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android.WORKSPACE
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android.WORKSPACE
@@ -3,3 +3,7 @@
 bind(name = "android/crosstool", actual = "@bazel_tools//tools/cpp:toolchain")
 bind(name = "android_sdk_for_testing", actual = "//:dummy")
 bind(name = "android_ndk_for_testing", actual = "//:dummy")
+
+# This value is overridden by android_sdk_repository function to allow targets
+# to select on whether or not android_sdk_repository has run.
+bind(name = "has_androidsdk", actual = "@bazel_tools//tools/android:always_false")
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
index bff9d57..72bef74 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ConfiguredAttributeMapperTest.java
@@ -265,4 +265,26 @@
     assertThat(getMapper("//a:lib").isAttributeValueExplicitlySpecified("linkstamp")).isFalse();
     assertThat(getMapper("//a:lib").get("linkstamp", BuildType.LABEL)).isNull();
   }
+
+  @Test
+  public void testAliasedConfigSetting() throws Exception {
+    writeConfigRules();
+    scratch.file(
+        "a/BUILD",
+        "alias(",
+        "    name = 'aliased_a',",
+        "    actual = '//conditions:a',",
+        ")",
+        "genrule(",
+        "    name = 'gen',",
+        "    srcs = [],",
+        "    outs = ['out'],",
+        "    cmd = '',",
+        "    message = select({",
+        "        ':aliased_a': 'defined message',",
+        "        '//conditions:default': None,",
+        "    }))");
+    useConfiguration("--define", "mode=a");
+    assertThat(getMapper("//a:gen").get("message", Type.STRING)).isEqualTo("defined message");
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ExternalPackageTest.java b/src/test/java/com/google/devtools/build/lib/packages/ExternalPackageTest.java
index 0dd6dfb..6f32b7d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/ExternalPackageTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/ExternalPackageTest.java
@@ -15,7 +15,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.devtools.build.lib.analysis.ConfiguredAttributeMapper;
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import org.junit.Before;
@@ -73,4 +76,35 @@
     assertThat(getTarget("//external:my_rule").getTargetKind())
         .isEqualTo("new_local_repository rule");
   }
+
+  @Test
+  public void testBindToConfigSetting() throws Exception {
+    FileSystemUtils.appendIsoLatin1(
+        workspacePath,
+        "bind(",
+        "    name = 'condition',",
+        "    actual = '//:setting',",
+        ")");
+    FileSystemUtils.writeIsoLatin1(
+        rootDirectory.getRelative("BUILD"),
+        "config_setting(",
+        "    name = 'setting',",
+        "    values = {'define': 'foo=bar'},",
+        ")",
+        "java_library(",
+        "    name = 'a',",
+        "    runtime_deps = select({",
+        "        '//external:condition': [':b'],",
+        "        '//conditions:default': [':c'],",
+        "    }),",
+        ")",
+        "java_library(name = 'b', srcs = [])",
+        "java_library(name = 'c', srcs = [])");
+    invalidatePackages();
+    useConfiguration("--define", "foo=bar");
+    ConfiguredAttributeMapper configuredAttributeMapper =
+        ConfiguredAttributeMapper.of((RuleConfiguredTarget) getConfiguredTarget("//:a"));
+    assertThat(configuredAttributeMapper.get("runtime_deps", BuildType.LABEL_LIST))
+        .containsExactly(Label.parseAbsolute("//:b"));
+  }
 }
diff --git a/tools/android/BUILD.tools b/tools/android/BUILD.tools
index 2c2e10f..7effede 100644
--- a/tools/android/BUILD.tools
+++ b/tools/android/BUILD.tools
@@ -240,3 +240,29 @@
     rule to your WORKSPACE. ; \
     exit 1 """,
 )
+
+# //external:has_androidsdk is bound to either
+# @bazel_tools//tools/android:always_true or
+# @bazel_tools//tools/android:always_false depending on whether
+# android_sdk_repository has run. This allows targets to depend on targets from
+# @androidsdk if and only if the user has an android_sdk_repository set up.
+
+config_feature_flag(
+    name = "true",
+    default_value = "true",
+    allowed_values = ["true", "false"],
+)
+
+config_setting(
+    name = "always_true",
+    flag_values = {
+        ":true": "true"
+    },
+)
+
+config_setting(
+    name = "always_false",
+    flag_values = {
+        ":true": "false",
+    },
+)