Add the necessary templates to make android_ndk_repository actually work.

Drive-by fix a minor issue that resulted in the @repository//pkg:label syntax not working for label-valued attributes.

--
MOS_MIGRATED_REVID=95716203
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 267b8d3..0a5a088 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -286,7 +286,7 @@
         // Check if the input starts with '/'. We don't check for "//" so that
         // we get a better error message if the user accidentally tries to use
         // an absolute path (starting with '/') for a label.
-        if (!input.startsWith("/")) {
+        if (!input.startsWith("/") && !input.startsWith("@")) {
           input = "//" + input;
         }
         return Label.parseAbsolute(input);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
index c5c05bb..e6cdd58 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
@@ -13,17 +13,25 @@
 // limitations under the License.
 package com.google.devtools.build.lib.bazel.rules.android;
 
+import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.bazel.repository.RepositoryFunction;
+import com.google.devtools.build.lib.packages.AttributeMap;
+import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
 import com.google.devtools.build.lib.packages.PackageIdentifier.RepositoryName;
 import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.skyframe.FileValue;
+import com.google.devtools.build.lib.util.ResourceFileLoader;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunctionException;
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 
+import java.io.IOException;
+import java.util.List;
+
 /**
  * Implementation of the {@code android_ndk} repository rule.
  */
@@ -48,7 +56,55 @@
       return null;
     }
 
-    return writeBuildFile(directoryValue, "filegroup(name='ndk')");
+    AttributeMap attributes = NonconfigurableAttributeMapper.of(rule);
+    String ruleName = rule.getName();
+    String apiLevel = attributes.get("api_level", Type.INTEGER).toString();
+    List<String> cpus = ImmutableList.of("arm");  // TODO(bazel-team): autodetect
+    String abi = "armeabi-v7a";  // TODO(bazel-team): Should this be an attribute on the rule?
+    String compiler = "4.9";  // TODO(bazel-team): Should this be an attribute on the rule?
+
+    String ccToolchainSuiteTemplate;
+    String ccToolchainTemplate;
+    String toolchainTemplate;
+
+    try {
+      ccToolchainSuiteTemplate = ResourceFileLoader.loadResource(
+          AndroidNdkRepositoryFunction.class, "android_ndk_cc_toolchain_suite_template.txt");
+      ccToolchainTemplate = ResourceFileLoader.loadResource(
+          AndroidNdkRepositoryFunction.class, "android_ndk_cc_toolchain_template.txt");
+      toolchainTemplate = ResourceFileLoader.loadResource(
+          AndroidNdkRepositoryFunction.class, "android_ndk_toolchain_template.txt");
+    } catch (IOException e) {
+      throw new IllegalStateException(e);
+    }
+
+    StringBuilder toolchainMap = new StringBuilder();
+    StringBuilder toolchainProtos = new StringBuilder();
+    StringBuilder toolchains = new StringBuilder();
+
+    for (String cpu : cpus) {
+      toolchainMap.append(String.format("\"%s\": \":cc-compiler-%s\", ", cpu, cpu));
+      toolchainProtos.append(toolchainTemplate
+          .replace("%repository%", ruleName)
+          .replace("%cpu%", cpu)
+          .replace("%abi%", abi)
+          .replace("%api_level%", apiLevel)
+          .replace("%compiler%", compiler));
+      toolchains.append(ccToolchainTemplate
+          .replace("%repository%", ruleName)
+          .replace("%cpu%", cpu)
+          .replace("%abi%", abi)
+          .replace("%api_level%", apiLevel)
+          .replace("%compiler%", compiler));
+    }
+
+    String buildFile = ccToolchainSuiteTemplate
+        .replace("%toolchain_map%", toolchainMap)
+        .replace("%toolchain_protos%", toolchainProtos)
+        .replace("%toolchains%", toolchains)
+        .replace("%default_cpu%", cpus.get(0));
+
+    return writeBuildFile(directoryValue, buildFile);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryRule.java
index 2de9bd7..e64fef9 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryRule.java
@@ -36,8 +36,8 @@
     return builder
         .setUndocumented()
         .setWorkspaceOnly()
-        .add(attr("path", STRING).mandatory())
-        .add(attr("api_level", INTEGER).mandatory())
+        .add(attr("path", STRING).mandatory().nonconfigurable("WORKSPACE rule"))
+        .add(attr("api_level", INTEGER).mandatory().nonconfigurable("WORKSPACE rule"))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_cc_toolchain_suite_template.txt b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_cc_toolchain_suite_template.txt
new file mode 100644
index 0000000..5f3b5a1
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_cc_toolchain_suite_template.txt
@@ -0,0 +1,18 @@
+package(default_visibility = ["//visibility:public"])
+
+cc_toolchain_suite(
+    name = "toolchain",
+    toolchains = { %toolchain_map% },
+    proto = """
+major_version: "android"
+minor_version: ""
+default_target_cpu: "%default_cpu%"
+%toolchain_protos%
+""")
+
+cc_library(
+    name = "malloc",
+    srcs = [],
+)
+
+%toolchains%
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_cc_toolchain_template.txt b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_cc_toolchain_template.txt
new file mode 100644
index 0000000..5ee4967
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_cc_toolchain_template.txt
@@ -0,0 +1,41 @@
+filegroup(
+    name = "%cpu%-android-%compiler%-toolchain",
+    srcs = glob([
+        "toolchains/%cpu%-linux-androideabi-%compiler%/**",
+    ]),
+    output_licenses = ["unencumbered"],
+)
+
+filegroup(
+    name = "%cpu%-android-%api_level%-%compiler%-files",
+    srcs = [
+        ":everything-%api_level%-%compiler%",
+        ":%cpu%-android-%compiler%-toolchain",
+    ],
+)
+
+cc_toolchain(
+    name = "cc-compiler-%cpu%",
+    all_files = ":%cpu%-android-%api_level%-%compiler%-files",
+    compiler_files = ":%cpu%-android-%compiler%-toolchain",
+    cpu = "%cpu%",
+    dwp_files = ":%cpu%-android-%compiler%-toolchain",
+    dynamic_runtime_libs = [":%cpu%-android-%compiler%-toolchain"],
+    linker_files = ":%cpu%-android-%compiler%-toolchain",
+    objcopy_files = ":%cpu%-android-%compiler%-toolchain",
+    static_runtime_libs = [":%cpu%-android-%compiler%-toolchain"],
+    strip_files = ":%cpu%-android-%compiler%-toolchain",
+    supports_param_files = 0,
+)
+
+filegroup(
+    name = "everything-%api_level%-%cpu%",
+    srcs = glob(
+        [
+            "platforms/android-%api_level%/arch-%cpu%/usr/include/**/*.h",
+            "platforms/android-%api_level%/arch-%cpu%/usr/lib/**/*.a",
+            "platforms/android-%api_level%/arch-%cpu%/usr/lib/**/*.o",
+            "platforms/android-%api_level%/arch-%cpu%/usr/lib/**/*.so",
+        ],
+    ),
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_toolchain_template.txt b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_toolchain_template.txt
new file mode 100644
index 0000000..d483cec
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_toolchain_template.txt
@@ -0,0 +1,123 @@
+default_toolchain {
+  cpu: "%cpu%"
+  toolchain_identifier: "%cpu%-linux-androideabi-%compiler%"
+}
+
+toolchain {
+
+  # this should be more specific
+  abi_version: "local"
+  abi_libc_version: "local"
+
+  compiler: "gcc"
+  host_system_name: "local"
+  needsPic: true
+  supports_gold_linker: false
+  supports_incremental_linker: false
+  supports_fission: false
+  supports_interface_shared_objects: false
+  supports_normalizing_ar: false
+  supports_start_end_lib: false
+  supports_thin_archives: false
+  target_libc: "local"
+
+  target_cpu: "%cpu%"
+  target_system_name: "%cpu%-linux-androideabi-%compiler%"
+  toolchain_identifier: "%cpu%-linux-androideabi-%compiler%"
+
+  tool_path { name: "ar"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-ar"
+  }
+  tool_path { name: "compat-ld"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-ld"
+  }
+  tool_path { name: "cpp"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-cpp"
+  }
+  tool_path { name: "dwp"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-dwp"
+  }
+  tool_path { name: "gcc"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-gcc"
+  }
+  tool_path { name: "gcov"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-gcov"
+  }
+  tool_path { name: "ld"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-ld"
+  }
+  tool_path { name: "nm"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-nm"
+  }
+  tool_path { name: "objcopy"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-objcopy"
+  }
+  tool_path { name: "strip"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-strip"
+  }
+  tool_path { name: "objdump"
+    path: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/bin/%cpu%-linux-androideabi-objdump"
+  }
+  objcopy_embed_flag: "-I"
+
+  cxx_flag: "-std=c++0x"
+  compilation_mode_flags {
+    mode: FASTBUILD
+  }
+  compilation_mode_flags {
+    mode: DBG
+  }
+  compilation_mode_flags {
+    mode: COVERAGE
+  }
+  compilation_mode_flags {
+    mode: OPT
+  }
+
+  cxx_flag: "-std=gnu++11"
+
+  cxx_builtin_include_directory: "external/%repository%/platforms/android-%api_level%/arch-%cpu%/usr/include"
+  cxx_builtin_include_directory: "external/%repository%/sources"
+  cxx_builtin_include_directory: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/lib/gcc/%cpu%-linux-androideabi/%compiler%/include"
+  cxx_builtin_include_directory: "external/%repository%/toolchains/%cpu%-linux-androideabi-%compiler%/prebuilt/linux-x86_64/lib/gcc/%cpu%-linux-androideabi/%compiler%/include-fixed"
+
+  unfiltered_cxx_flag: "-isystemexternal/%repository%/platforms/android-%api_level%/arch-%cpu%/usr/include"
+  unfiltered_cxx_flag: "-isystemexternal/%repository%/sources/cxx-stl/gnu-libstdc++/%compiler%/include"
+  unfiltered_cxx_flag: "-isystemexternal/%repository%/sources/cxx-stl/gnu-libstdc++/%compiler%/libs/%abi%/include"
+
+  unfiltered_cxx_flag: "-isystem"
+  unfiltered_cxx_flag: "external/%repository%/sources/cxx-stl/stlport/stlport"
+  unfiltered_cxx_flag: "-isystem"
+  unfiltered_cxx_flag: "external/%repository%/sources/cxx-stl/gabi++/include"
+
+  linking_mode_flags {
+    mode: FULLY_STATIC
+  }
+  objcopy_embed_flag: "-I"
+  objcopy_embed_flag: "binary"
+  linking_mode_flags {
+    mode: MOSTLY_STATIC
+  }
+  linking_mode_flags {
+    mode: DYNAMIC
+  }
+
+  unfiltered_cxx_flag: "-fno-canonical-system-headers"
+  unfiltered_cxx_flag: "-no-canonical-prefixes"
+
+  linker_flag: "-no-canonical-prefixes"
+
+  compiler_flag: "-fPIE"
+  compiler_flag: "-DANDROID"
+  compiler_flag: "-g"
+
+  linker_flag: "--sysroot=external/%repository%/platforms/android-%api_level%/arch-%cpu%"
+  linker_flag: "-fPIE"
+  linker_flag: "-pie"
+
+  linker_flag: "-Lexternal/%repository%/sources/cxx-stl/gnu-libstdc++/%compiler%/libs/%abi%/"
+  linker_flag: "-lgnustl_static"
+  linker_flag: "-lsupc++"
+  linker_flag: "-lc"
+  linker_flag: "-lm"
+}