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"
+}