aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar Adam Michael <ajmichael@google.com>2017-01-26 15:38:34 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2017-01-26 23:00:08 +0000
commit3809e4cdf2b540ff617a7cc347b5dafe98c84dfb (patch)
treea623142f5fc68687e6268466ec9a6a57aeae2423 /src/main/java
parentae1b706de9b324134e9aca74fecb6bcee53b0315 (diff)
Adds Bazel support for Android NDK R13.
NDK13 changelog: https://github.com/android-ndk/ndk/wiki/Changelog-r13. The most notable change is that the default compiler is now clang and GCC is not supported. Also introduces an interface to encapsulate the creation and usage of ApiLevel and AndroidNdkCrosstoolsR* so that we can get rid of the repeated if-statements checking NDK major version. RELNOTES: android_ndk_repository now supports Android NDK R13. -- PiperOrigin-RevId: 145672022 MOS_MIGRATED_REVID=145672022
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstools.java53
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ApiLevel.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/NdkMajorRevision.java35
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/StlImpl.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/AndroidNdkCrosstoolsR10e.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/ApiLevelR10e.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/NdkMajorRevisionR10.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/AndroidNdkCrosstoolsR11.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/ApiLevelR11.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/NdkMajorRevisionR11.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/AndroidNdkCrosstoolsR12.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/ApiLevelR12.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/NdkMajorRevisionR12.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/AndroidNdkCrosstoolsR13.java106
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/ApiLevelR13.java67
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/ArmCrosstools.java175
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/MipsCrosstools.java132
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/NdkMajorRevisionR13.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/X86Crosstools.java111
20 files changed, 831 insertions, 104 deletions
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 e0975bf315..9ec13d24a5 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
@@ -58,7 +58,7 @@ public class AndroidNdkRepositoryFunction extends RepositoryFunction {
private static final String TOOLCHAIN_NAME_PREFIX = "toolchain-";
private static final String PATH_ENV_VAR = "ANDROID_NDK_HOME";
-
+
private static final class CrosstoolStlPair {
private final CrosstoolRelease crosstoolRelease;
@@ -117,7 +117,10 @@ public class AndroidNdkRepositoryFunction extends RepositoryFunction {
ApiLevel apiLevel;
try {
String apiLevelAttr = attributes.get("api_level", Type.INTEGER).toString();
- apiLevel = ApiLevel.getApiLevel(ndkRelease, env.getListener(), ruleName, apiLevelAttr);
+ apiLevel =
+ AndroidNdkCrosstools.KNOWN_NDK_MAJOR_REVISIONS
+ .get(ndkRelease.majorRevision)
+ .apiLevel(env.getListener(), ruleName, apiLevelAttr);
} catch (EvalException e) {
throw new RepositoryFunctionException(e, Transience.PERSISTENT);
}
@@ -136,7 +139,7 @@ public class AndroidNdkRepositoryFunction extends RepositoryFunction {
+ "The revision of the Android NDK given in android_ndk_repository rule '%s' is '%s'",
AndroidNdkCrosstools.LATEST_KNOWN_REVISION, ruleName, ndkRelease.rawRelease)));
}
-
+
ImmutableList.Builder<CrosstoolStlPair> crosstoolsAndStls = ImmutableList.builder();
try {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstools.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstools.java
index 6ebaa69fb7..187f005028 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstools.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstools.java
@@ -14,23 +14,32 @@
package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools;
-import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r10e.AndroidNdkCrosstoolsR10e;
-import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r11.AndroidNdkCrosstoolsR11;
-import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r12.AndroidNdkCrosstoolsR12;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r10e.NdkMajorRevisionR10;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r11.NdkMajorRevisionR11;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r12.NdkMajorRevisionR12;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r13.NdkMajorRevisionR13;
import com.google.devtools.build.lib.util.OS;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CrosstoolRelease;
/**
- * Generates a CrosstoolRelease proto for the Android NDK based on a particular NDK release.
+ * Helper methods for generating a CrosstoolRelease proto for the Android NDK based on a particular
+ * NDK release.
*/
-public class AndroidNdkCrosstools {
+public final class AndroidNdkCrosstools {
+ private AndroidNdkCrosstools() {}
// NDK minor revisions should be backwards compatible within a major revision, so all that needs
// to be tracked here are the major revision numbers.
- private static final String NDK_REVISION_10 = "10";
- private static final String NDK_REVISION_11 = "11";
- private static final String NDK_REVISION_12 = "12";
- public static final String LATEST_KNOWN_REVISION = NDK_REVISION_12;
+ public static final ImmutableMap<String, NdkMajorRevision> KNOWN_NDK_MAJOR_REVISIONS =
+ ImmutableMap.of(
+ "10", new NdkMajorRevisionR10(),
+ "11", new NdkMajorRevisionR11(),
+ "12", new NdkMajorRevisionR12(),
+ "13", new NdkMajorRevisionR13());
+ public static final String LATEST_KNOWN_REVISION =
+ Iterables.getLast(KNOWN_NDK_MAJOR_REVISIONS.keySet());
/**
* Exception thrown when there is an error creating the crosstools file.
@@ -46,24 +55,16 @@ public class AndroidNdkCrosstools {
NdkPaths ndkPaths,
StlImpl stlImpl,
String hostPlatform) {
-
- // If the NDK revision isn't valid, try using the latest one we know about.
- String majorRevision;
+ NdkMajorRevision ndkMajorRevision;
if (ndkRelease.isValid) {
- majorRevision = ndkRelease.majorRevision;
- } else {
- majorRevision = LATEST_KNOWN_REVISION;
- }
-
- // NDK minor revisions should be backwards compatible within a major revision, so it should be
- // enough to check the major revision of the release.
- if (NDK_REVISION_10.equals(majorRevision)) {
- return AndroidNdkCrosstoolsR10e.create(ndkPaths, stlImpl, hostPlatform);
- } else if (NDK_REVISION_11.equals(majorRevision)) {
- return AndroidNdkCrosstoolsR11.create(ndkPaths, stlImpl, hostPlatform);
+ // NDK minor revisions should be backwards compatible within a major revision, so it should be
+ // enough to check the major revision of the release.
+ ndkMajorRevision = KNOWN_NDK_MAJOR_REVISIONS.get(ndkRelease.majorRevision);
} else {
- return AndroidNdkCrosstoolsR12.create(ndkPaths, stlImpl, hostPlatform);
+ // If the NDK revision isn't valid, try using the latest one we know about.
+ ndkMajorRevision = KNOWN_NDK_MAJOR_REVISIONS.get(LATEST_KNOWN_REVISION);
}
+ return ndkMajorRevision.crosstoolRelease(ndkPaths, stlImpl, hostPlatform);
}
public static String getHostPlatform(NdkRelease ndkRelease) throws NdkCrosstoolsException {
@@ -97,8 +98,6 @@ public class AndroidNdkCrosstools {
}
public static boolean isKnownNDKRevision(NdkRelease ndkRelease) {
- return NDK_REVISION_10.equals(ndkRelease.majorRevision)
- || NDK_REVISION_11.equals(ndkRelease.majorRevision)
- || NDK_REVISION_12.equals(ndkRelease.majorRevision);
+ return KNOWN_NDK_MAJOR_REVISIONS.containsKey(ndkRelease.majorRevision);
}
} \ No newline at end of file
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ApiLevel.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ApiLevel.java
index 14ccb785a4..4fe66c293d 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ApiLevel.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ApiLevel.java
@@ -17,29 +17,14 @@ package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r10e.ApiLevelR10e;
-import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r11.ApiLevelR11;
-import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r12.ApiLevelR12;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
/**
- * Base class for ApiLevels, which provides a factory function to create an ApiLevel based on an
- * NDK release.
+ * Base class for NDK revision specific {@code ApiLevel}s that encapsulates NDK information about
+ * api level to architecture mappings and api level equivalences.
*/
-public abstract class ApiLevel {
-
- public static ApiLevel getApiLevel(
- NdkRelease release, EventHandler eventHandler, String repositoryName, String apiLevel) {
- if ("10".equals(release.majorRevision)) {
- return new ApiLevelR10e(eventHandler, repositoryName, apiLevel);
- } else if ("11".equals(release.majorRevision)) {
- return new ApiLevelR11(eventHandler, repositoryName, apiLevel);
- } else {
- return new ApiLevelR12(eventHandler, repositoryName, apiLevel);
- }
- }
-
+public class ApiLevel {
/**
* Maps an Android API level to the architectures that that level supports.
* Based on the directories in the "platforms" directory in the NDK.
@@ -86,7 +71,7 @@ public abstract class ApiLevel {
return correctedApiLevel;
}
- public String getCpuCorrectedApiLevel(String targetCpu) {
+ String getCpuCorrectedApiLevel(String targetCpu) {
// Check that this API level supports the given cpu architecture (eg 64 bit is supported on only
// 21+).
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/NdkMajorRevision.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/NdkMajorRevision.java
new file mode 100644
index 0000000000..ba107809ec
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/NdkMajorRevision.java
@@ -0,0 +1,35 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools;
+
+import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CrosstoolRelease;
+
+/** An interface to encapsulate logic that is specific to the Ndk major revision. */
+public interface NdkMajorRevision {
+ /**
+ * Creates a CrosstoolRelease proto for the Android NDK. The crosstools are generated through code
+ * rather than checked in as a flat file to reduce the amount of templateing needed (for
+ * parameters like the release name and certain paths), to reduce duplication, and to make it
+ * easier to support future versions of the NDK.
+ */
+ CrosstoolRelease crosstoolRelease(NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform);
+
+ /**
+ * Creates an {@code ApiLevel} that contains information about NDK-specific supported api levels
+ * and api level to architecture mappings.
+ */
+ ApiLevel apiLevel(EventHandler eventHandler, String name, String apiLevel);
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/StlImpl.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/StlImpl.java
index 6b50a11361..b132258aeb 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/StlImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/StlImpl.java
@@ -31,9 +31,10 @@ public abstract class StlImpl {
private enum RuntimeType {
DYNAMIC("so"), STATIC("a");
- private final String name, fileExtension;
+ private final String name;
+ private final String fileExtension;
- private RuntimeType(String fileExtension) {
+ RuntimeType(String fileExtension) {
this.name = name().toLowerCase();
this.fileExtension = fileExtension;
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/AndroidNdkCrosstoolsR10e.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/AndroidNdkCrosstoolsR10e.java
index b128ec140d..f2ac4b4e97 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/AndroidNdkCrosstoolsR10e.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/AndroidNdkCrosstoolsR10e.java
@@ -28,8 +28,7 @@ import java.util.Map.Entry;
/**
* Generates a CrosstoolRelease proto for the Android NDK.
*/
-public class AndroidNdkCrosstoolsR10e {
-
+final class AndroidNdkCrosstoolsR10e {
private AndroidNdkCrosstoolsR10e() {}
/**
@@ -42,20 +41,14 @@ public class AndroidNdkCrosstoolsR10e {
*
* @return A CrosstoolRelease for the Android NDK.
*/
- public static CrosstoolRelease create(
- NdkPaths ndkPaths,
- StlImpl stlImpl,
- String hostPlatform) {
-
- CrosstoolRelease crosstoolRelease = CrosstoolRelease.newBuilder()
+ static CrosstoolRelease create(NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
+ return CrosstoolRelease.newBuilder()
.setMajorVersion("android")
.setMinorVersion("")
.setDefaultTargetCpu("armeabi")
.addAllDefaultToolchain(getDefaultCpuToolchains(stlImpl))
.addAllToolchain(createToolchains(ndkPaths, stlImpl, hostPlatform))
.build();
-
- return crosstoolRelease;
}
private static ImmutableList<CToolchain> createToolchains(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/ApiLevelR10e.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/ApiLevelR10e.java
index 743025fa3f..a3b7f3b086 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/ApiLevelR10e.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/ApiLevelR10e.java
@@ -22,8 +22,7 @@ import com.google.devtools.build.lib.events.EventHandler;
/**
* Class which encodes information from the Android NDK makefiles about API levels.
*/
-public class ApiLevelR10e extends ApiLevel {
-
+final class ApiLevelR10e extends ApiLevel {
private static final ImmutableListMultimap<String, String> API_LEVEL_TO_ARCHITECTURES =
ImmutableListMultimap.<String, String>builder()
.putAll("3", "arm")
@@ -98,11 +97,7 @@ public class ApiLevelR10e extends ApiLevel {
.build();
- public ApiLevelR10e(
- EventHandler eventHandler,
- String repositoryName,
- String apiLevel) {
-
+ ApiLevelR10e(EventHandler eventHandler, String repositoryName, String apiLevel) {
super(API_LEVEL_TO_ARCHITECTURES, API_EQUIVALENCIES, eventHandler, repositoryName, apiLevel);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/NdkMajorRevisionR10.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/NdkMajorRevisionR10.java
new file mode 100644
index 0000000000..8d17843d18
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r10e/NdkMajorRevisionR10.java
@@ -0,0 +1,36 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r10e;
+
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.ApiLevel;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkMajorRevision;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkPaths;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpl;
+import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CrosstoolRelease;
+
+/** Logic specific to Android NDK R12. */
+public class NdkMajorRevisionR10 implements NdkMajorRevision {
+ @Override
+ public CrosstoolRelease crosstoolRelease(
+ NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
+ return AndroidNdkCrosstoolsR10e.create(ndkPaths, stlImpl, hostPlatform);
+ }
+
+ @Override
+ public ApiLevel apiLevel(EventHandler eventHandler, String name, String apiLevel) {
+ return new ApiLevelR10e(eventHandler, name, apiLevel);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/AndroidNdkCrosstoolsR11.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/AndroidNdkCrosstoolsR11.java
index 870bfb44d7..5efc26d504 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/AndroidNdkCrosstoolsR11.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/AndroidNdkCrosstoolsR11.java
@@ -28,8 +28,7 @@ import java.util.Map.Entry;
/**
* Generates a CrosstoolRelease proto for the Android NDK.
*/
-public class AndroidNdkCrosstoolsR11 {
-
+final class AndroidNdkCrosstoolsR11 {
private AndroidNdkCrosstoolsR11() {}
/**
@@ -42,20 +41,14 @@ public class AndroidNdkCrosstoolsR11 {
*
* @return A CrosstoolRelease for the Android NDK.
*/
- public static CrosstoolRelease create(
- NdkPaths ndkPaths,
- StlImpl stlImpl,
- String hostPlatform) {
-
- CrosstoolRelease crosstoolRelease = CrosstoolRelease.newBuilder()
+ public static CrosstoolRelease create(NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
+ return CrosstoolRelease.newBuilder()
.setMajorVersion("android")
.setMinorVersion("")
.setDefaultTargetCpu("armeabi")
.addAllDefaultToolchain(getDefaultCpuToolchains(stlImpl))
.addAllToolchain(createToolchains(ndkPaths, stlImpl, hostPlatform))
.build();
-
- return crosstoolRelease;
}
private static ImmutableList<CToolchain> createToolchains(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/ApiLevelR11.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/ApiLevelR11.java
index 59d98caf81..7bf99f9def 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/ApiLevelR11.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/ApiLevelR11.java
@@ -22,8 +22,7 @@ import com.google.devtools.build.lib.events.EventHandler;
/**
* Class which encodes information from the Android NDK makefiles about API levels.
*/
-public class ApiLevelR11 extends ApiLevel {
-
+final class ApiLevelR11 extends ApiLevel {
private static final ImmutableListMultimap<String, String> API_LEVEL_TO_ARCHITECTURES =
ImmutableListMultimap.<String, String>builder()
.putAll("3", "arm")
@@ -103,11 +102,7 @@ public class ApiLevelR11 extends ApiLevel {
.build();
- public ApiLevelR11(
- EventHandler eventHandler,
- String repositoryName,
- String apiLevel) {
-
+ ApiLevelR11(EventHandler eventHandler, String repositoryName, String apiLevel) {
super(API_LEVEL_TO_ARCHITECTURES, API_EQUIVALENCIES, eventHandler, repositoryName, apiLevel);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/NdkMajorRevisionR11.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/NdkMajorRevisionR11.java
new file mode 100644
index 0000000000..94a9269e5c
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r11/NdkMajorRevisionR11.java
@@ -0,0 +1,36 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r11;
+
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.ApiLevel;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkMajorRevision;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkPaths;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpl;
+import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CrosstoolRelease;
+
+/** Logic specific to Android NDK R12. */
+public class NdkMajorRevisionR11 implements NdkMajorRevision {
+ @Override
+ public CrosstoolRelease crosstoolRelease(
+ NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
+ return AndroidNdkCrosstoolsR11.create(ndkPaths, stlImpl, hostPlatform);
+ }
+
+ @Override
+ public ApiLevel apiLevel(EventHandler eventHandler, String name, String apiLevel) {
+ return new ApiLevelR11(eventHandler, name, apiLevel);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/AndroidNdkCrosstoolsR12.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/AndroidNdkCrosstoolsR12.java
index eee1a3e534..91a0614de2 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/AndroidNdkCrosstoolsR12.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/AndroidNdkCrosstoolsR12.java
@@ -26,10 +26,8 @@ import java.util.List;
import java.util.Map.Entry;
/** Generates a CrosstoolRelease proto for the Android NDK. */
-public class AndroidNdkCrosstoolsR12 {
-
+final class AndroidNdkCrosstoolsR12 {
private AndroidNdkCrosstoolsR12() {}
-
/**
* Creates a CrosstoolRelease proto for the Android NDK, given the API level to use and the
* release revision. The crosstools are generated through code rather than checked in as a flat
@@ -40,18 +38,14 @@ public class AndroidNdkCrosstoolsR12 {
*
* @return A CrosstoolRelease for the Android NDK.
*/
- public static CrosstoolRelease create(NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
-
- CrosstoolRelease crosstoolRelease =
- CrosstoolRelease.newBuilder()
- .setMajorVersion("android")
- .setMinorVersion("")
- .setDefaultTargetCpu("armeabi")
- .addAllDefaultToolchain(getDefaultCpuToolchains(stlImpl))
- .addAllToolchain(createToolchains(ndkPaths, stlImpl, hostPlatform))
- .build();
-
- return crosstoolRelease;
+ static CrosstoolRelease create(NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
+ return CrosstoolRelease.newBuilder()
+ .setMajorVersion("android")
+ .setMinorVersion("")
+ .setDefaultTargetCpu("armeabi")
+ .addAllDefaultToolchain(getDefaultCpuToolchains(stlImpl))
+ .addAllToolchain(createToolchains(ndkPaths, stlImpl, hostPlatform))
+ .build();
}
private static ImmutableList<CToolchain> createToolchains(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/ApiLevelR12.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/ApiLevelR12.java
index c4816f5c7a..9db5021a40 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/ApiLevelR12.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/ApiLevelR12.java
@@ -20,8 +20,7 @@ import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.ApiLevel;
import com.google.devtools.build.lib.events.EventHandler;
/** Class which encodes information from the Android NDK makefiles about API levels. */
-public class ApiLevelR12 extends ApiLevel {
-
+final class ApiLevelR12 extends ApiLevel {
private static final ImmutableListMultimap<String, String> API_LEVEL_TO_ARCHITECTURES =
ImmutableListMultimap.<String, String>builder()
.putAll("8", "arm")
@@ -85,12 +84,12 @@ public class ApiLevelR12 extends ApiLevel {
// Case 4
.put("21", "21")
- .put("22", "21")
+ .put("22", "22")
.put("23", "23")
.put("24", "24")
.build();
- public ApiLevelR12(EventHandler eventHandler, String repositoryName, String apiLevel) {
+ ApiLevelR12(EventHandler eventHandler, String repositoryName, String apiLevel) {
super(API_LEVEL_TO_ARCHITECTURES, API_EQUIVALENCIES, eventHandler, repositoryName, apiLevel);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/NdkMajorRevisionR12.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/NdkMajorRevisionR12.java
new file mode 100644
index 0000000000..0e78b76f6c
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r12/NdkMajorRevisionR12.java
@@ -0,0 +1,36 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r12;
+
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.ApiLevel;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkMajorRevision;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkPaths;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpl;
+import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CrosstoolRelease;
+
+/** Logic specific to Android NDK R12. */
+public class NdkMajorRevisionR12 implements NdkMajorRevision {
+ @Override
+ public CrosstoolRelease crosstoolRelease(
+ NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
+ return AndroidNdkCrosstoolsR12.create(ndkPaths, stlImpl, hostPlatform);
+ }
+
+ @Override
+ public ApiLevel apiLevel(EventHandler eventHandler, String name, String apiLevel) {
+ return new ApiLevelR12(eventHandler, name, apiLevel);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/AndroidNdkCrosstoolsR13.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/AndroidNdkCrosstoolsR13.java
new file mode 100644
index 0000000000..6ba2ee1b71
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/AndroidNdkCrosstoolsR13.java
@@ -0,0 +1,106 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r13;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkPaths;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpl;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CrosstoolRelease;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.DefaultCpuToolchain;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map.Entry;
+
+/** Generates a CrosstoolRelease proto for the Android NDK. */
+final class AndroidNdkCrosstoolsR13 {
+ /**
+ * Creates a CrosstoolRelease proto for the Android NDK, given the API level to use and the
+ * release revision. The crosstools are generated through code rather than checked in as a flat
+ * file to reduce the amount of templating needed (for parameters like the release name and
+ * certain paths), to reduce duplication, and to make it easier to support future versions of the
+ * NDK. TODO(bazel-team): Eventually we should move this into Skylark so the crosstools can be
+ * updated independently of Bazel itself.
+ *
+ * @return A CrosstoolRelease for the Android NDK.
+ */
+ static CrosstoolRelease create(NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
+ return CrosstoolRelease.newBuilder()
+ .setMajorVersion("android")
+ .setMinorVersion("")
+ .setDefaultTargetCpu("armeabi")
+ .addAllDefaultToolchain(getDefaultCpuToolchains(stlImpl))
+ .addAllToolchain(createToolchains(ndkPaths, stlImpl, hostPlatform))
+ .build();
+ }
+
+ private static ImmutableList<CToolchain> createToolchains(
+ NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
+
+ List<CToolchain.Builder> toolchainBuilders = new ArrayList<>();
+ toolchainBuilders.addAll(new ArmCrosstools(ndkPaths, stlImpl).createCrosstools());
+ toolchainBuilders.addAll(new MipsCrosstools(ndkPaths, stlImpl).createCrosstools());
+ toolchainBuilders.addAll(new X86Crosstools(ndkPaths, stlImpl).createCrosstools());
+
+ ImmutableList.Builder<CToolchain> toolchains = new ImmutableList.Builder<>();
+
+ // Set attributes common to all toolchains.
+ for (CToolchain.Builder toolchainBuilder : toolchainBuilders) {
+ toolchainBuilder
+ .setHostSystemName(hostPlatform)
+ .setTargetLibc("local")
+ .setAbiVersion(toolchainBuilder.getTargetCpu())
+ .setAbiLibcVersion("local");
+
+ // builtin_sysroot is set individually on each toolchain.
+ toolchainBuilder.addCxxBuiltinIncludeDirectory("%sysroot%/usr/include");
+
+ toolchains.add(toolchainBuilder.build());
+ }
+
+ return toolchains.build();
+ }
+
+ private static ImmutableList<DefaultCpuToolchain> getDefaultCpuToolchains(StlImpl stlImpl) {
+ // TODO(bazel-team): It would be better to auto-generate this somehow.
+
+ ImmutableMap<String, String> defaultCpus =
+ ImmutableMap.<String, String>builder()
+ // arm
+ .put("armeabi", "arm-linux-androideabi-clang3.8")
+ .put("armeabi-v7a", "arm-linux-androideabi-clang3.8-v7a")
+ .put("arm64-v8a", "aarch64-linux-android-clang3.8")
+
+ // mips
+ .put("mips", "mipsel-linux-android-clang3.8")
+ .put("mips64", "mips64el-linux-android-clang3.8")
+
+ // x86
+ .put("x86", "x86-clang3.8")
+ .put("x86_64", "x86_64-clang3.8")
+ .build();
+
+ ImmutableList.Builder<DefaultCpuToolchain> defaultCpuToolchains = ImmutableList.builder();
+ for (Entry<String, String> defaultCpu : defaultCpus.entrySet()) {
+ defaultCpuToolchains.add(
+ DefaultCpuToolchain.newBuilder()
+ .setCpu(defaultCpu.getKey())
+ .setToolchainIdentifier(defaultCpu.getValue() + "-" + stlImpl.getName())
+ .build());
+ }
+ return defaultCpuToolchains.build();
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/ApiLevelR13.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/ApiLevelR13.java
new file mode 100644
index 0000000000..64631629ba
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/ApiLevelR13.java
@@ -0,0 +1,67 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r13;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.ApiLevel;
+import com.google.devtools.build.lib.events.EventHandler;
+
+/** Class which encodes information from the Android NDK makefiles about API levels. */
+final class ApiLevelR13 extends ApiLevel {
+ /** This is the contents of {@code platforms/android-*} */
+ private static final ImmutableListMultimap<String, String> API_LEVEL_TO_ARCHITECTURES =
+ ImmutableListMultimap.<String, String>builder()
+ .putAll("9", "arm", "mips", "x86")
+ .putAll("12", "arm", "mips", "x86")
+ .putAll("13", "arm", "mips", "x86")
+ .putAll("14", "arm", "mips", "x86")
+ .putAll("15", "arm", "mips", "x86")
+ .putAll("16", "arm", "mips", "x86")
+ .putAll("17", "arm", "mips", "x86")
+ .putAll("18", "arm", "mips", "x86")
+ .putAll("19", "arm", "mips", "x86")
+ .putAll("21", "arm", "mips", "x86", "arm64", "mips64", "x86_64")
+ .putAll("23", "arm", "mips", "x86", "arm64", "mips64", "x86_64")
+ .putAll("24", "arm", "mips", "x86", "arm64", "mips64", "x86_64")
+ .build();
+
+ /** This map fill in the gaps of {@code API_LEVEL_TO_ARCHITECTURES}. */
+ private static final ImmutableMap<String, String> API_EQUIVALENCIES =
+ ImmutableMap.<String, String>builder()
+ .put("8", "8")
+ .put("9", "9")
+ .put("10", "9")
+ .put("11", "9")
+ .put("12", "12")
+ .put("13", "12")
+ .put("14", "14")
+ .put("15", "14")
+ .put("16", "16")
+ .put("17", "16")
+ .put("18", "18")
+ .put("19", "19")
+ .put("20", "19")
+ .put("21", "21")
+ .put("22", "22")
+ .put("23", "23")
+ .put("24", "24")
+ .put("25", "24")
+ .build();
+
+ ApiLevelR13(EventHandler eventHandler, String repositoryName, String apiLevel) {
+ super(API_LEVEL_TO_ARCHITECTURES, API_EQUIVALENCIES, eventHandler, repositoryName, apiLevel);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/ArmCrosstools.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/ArmCrosstools.java
new file mode 100644
index 0000000000..e8dcc37fdb
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/ArmCrosstools.java
@@ -0,0 +1,175 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r13;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkPaths;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpl;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CompilationMode;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CompilationModeFlags;
+import java.util.List;
+
+/**
+ * Crosstool definitions for ARM. These values are based on the setup.mk files in the Android NDK
+ * toolchain directories.
+ */
+final class ArmCrosstools {
+ private final NdkPaths ndkPaths;
+ private final StlImpl stlImpl;
+
+ ArmCrosstools(NdkPaths ndkPaths, StlImpl stlImpl) {
+ this.ndkPaths = ndkPaths;
+ this.stlImpl = stlImpl;
+ }
+
+ ImmutableList<CToolchain.Builder> createCrosstools() {
+ return ImmutableList.<CToolchain.Builder>builder()
+ .add(createAarch64ClangToolchain())
+ .addAll(createArmeabiClangToolchain())
+ .build();
+ }
+
+ private CToolchain.Builder createAarch64ClangToolchain() {
+ String toolchainName = "aarch64-linux-android-4.9";
+ String targetPlatform = "aarch64-linux-android";
+ String gccToolchain = ndkPaths.createGccToolchainPath(toolchainName);
+ String llvmTriple = "aarch64-none-linux-android";
+
+ CToolchain.Builder toolchain =
+ CToolchain.newBuilder()
+ .setToolchainIdentifier("aarch64-linux-android-clang3.8")
+ .setTargetSystemName("aarch64-linux-android")
+ .setTargetCpu("arm64-v8a")
+ .setCompiler("clang3.8")
+ .addAllToolPath(ndkPaths.createClangToolpaths(toolchainName, targetPlatform, null))
+ .setBuiltinSysroot(ndkPaths.createBuiltinSysroot("arm64"))
+
+ // Compiler flags
+ .addCompilerFlag("-gcc-toolchain")
+ .addCompilerFlag(gccToolchain)
+ .addCompilerFlag("-target")
+ .addCompilerFlag(llvmTriple)
+ .addCompilerFlag("-ffunction-sections")
+ .addCompilerFlag("-funwind-tables")
+ .addCompilerFlag("-fstack-protector-strong")
+ .addCompilerFlag("-fpic")
+ .addCompilerFlag("-Wno-invalid-command-line-argument")
+ .addCompilerFlag("-Wno-unused-command-line-argument")
+ .addCompilerFlag("-no-canonical-prefixes")
+
+ // Linker flags
+ .addLinkerFlag("-gcc-toolchain")
+ .addLinkerFlag(gccToolchain)
+ .addLinkerFlag("-target")
+ .addLinkerFlag(llvmTriple)
+ .addLinkerFlag("-no-canonical-prefixes")
+
+ // Additional release flags
+ .addCompilationModeFlags(
+ CompilationModeFlags.newBuilder()
+ .setMode(CompilationMode.OPT)
+ .addCompilerFlag("-O2")
+ .addCompilerFlag("-g")
+ .addCompilerFlag("-DNDEBUG"))
+
+ // Additional debug flags
+ .addCompilationModeFlags(
+ CompilationModeFlags.newBuilder()
+ .setMode(CompilationMode.DBG)
+ .addCompilerFlag("-O0")
+ .addCompilerFlag("-UNDEBUG"));
+
+ ndkPaths.addToolchainIncludePaths(toolchain, toolchainName, targetPlatform, "4.9.x");
+ stlImpl.addStlImpl(toolchain, "4.9");
+ return toolchain;
+ }
+
+ private List<CToolchain.Builder> createArmeabiClangToolchain() {
+ ImmutableList<CToolchain.Builder> toolchains =
+ ImmutableList.of(
+ createBaseArmeabiClangToolchain()
+ .setToolchainIdentifier("arm-linux-androideabi-clang3.8")
+ .setTargetCpu("armeabi")
+ .addCompilerFlag("-target")
+ .addCompilerFlag("armv5te-none-linux-androideabi") // LLVM_TRIPLE
+ .addCompilerFlag("-march=armv5te")
+ .addCompilerFlag("-mtune=xscale")
+ .addCompilerFlag("-msoft-float")
+ .addLinkerFlag("-target")
+ // LLVM_TRIPLE
+ .addLinkerFlag("armv5te-none-linux-androideabi"),
+ createBaseArmeabiClangToolchain()
+ .setToolchainIdentifier("arm-linux-androideabi-clang3.8-v7a")
+ .setTargetCpu("armeabi-v7a")
+ .addCompilerFlag("-target")
+ .addCompilerFlag("armv7-none-linux-androideabi") // LLVM_TRIPLE
+ .addCompilerFlag("-march=armv7-a")
+ .addCompilerFlag("-mfloat-abi=softfp")
+ .addCompilerFlag("-mfpu=vfpv3-d16")
+ .addLinkerFlag("-target")
+ .addLinkerFlag("armv7-none-linux-androideabi") // LLVM_TRIPLE
+ .addLinkerFlag("-Wl,--fix-cortex-a8"));
+ stlImpl.addStlImpl(toolchains, "4.9");
+ return toolchains;
+ }
+
+ private CToolchain.Builder createBaseArmeabiClangToolchain() {
+ String toolchainName = "arm-linux-androideabi-4.9";
+ String targetPlatform = "arm-linux-androideabi";
+ String gccToolchain = ndkPaths.createGccToolchainPath("arm-linux-androideabi-4.9");
+
+ CToolchain.Builder toolchain =
+ CToolchain.newBuilder()
+ .setTargetSystemName("arm-linux-androideabi")
+ .setCompiler("clang3.8")
+ .addAllToolPath(ndkPaths.createClangToolpaths(toolchainName, targetPlatform, null))
+ .setBuiltinSysroot(ndkPaths.createBuiltinSysroot("arm"))
+
+ // Compiler flags
+ .addCompilerFlag("-gcc-toolchain")
+ .addCompilerFlag(gccToolchain)
+ .addCompilerFlag("-fpic")
+ .addCompilerFlag("-ffunction-sections")
+ .addCompilerFlag("-funwind-tables")
+ .addCompilerFlag("-fstack-protector-strong")
+ .addCompilerFlag("-Wno-invalid-command-line-argument")
+ .addCompilerFlag("-Wno-unused-command-line-argument")
+ .addCompilerFlag("-no-canonical-prefixes")
+ .addCompilerFlag("-fno-integrated-as")
+
+ // Linker flags
+ .addLinkerFlag("-gcc-toolchain")
+ .addLinkerFlag(gccToolchain)
+ .addLinkerFlag("-no-canonical-prefixes");
+
+ toolchain.addCompilationModeFlags(
+ CompilationModeFlags.newBuilder()
+ .setMode(CompilationMode.OPT)
+ .addCompilerFlag("-mthumb")
+ .addCompilerFlag("-Os")
+ .addCompilerFlag("-g")
+ .addCompilerFlag("-DNDEBUG"));
+ toolchain.addCompilationModeFlags(
+ CompilationModeFlags.newBuilder()
+ .setMode(CompilationMode.DBG)
+ .addCompilerFlag("-g")
+ .addCompilerFlag("-fno-strict-aliasing")
+ .addCompilerFlag("-O0")
+ .addCompilerFlag("-UNDEBUG"));
+ ndkPaths.addToolchainIncludePaths(toolchain, toolchainName, targetPlatform, "4.9.x");
+ return toolchain;
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/MipsCrosstools.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/MipsCrosstools.java
new file mode 100644
index 0000000000..363649861f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/MipsCrosstools.java
@@ -0,0 +1,132 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r13;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkPaths;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpl;
+import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CompilationMode;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CompilationModeFlags;
+
+/**
+ * Crosstool definitions for MIPS. These values are based on the setup.mk files in the Android NDK
+ * toolchain directories.
+ */
+final class MipsCrosstools {
+ private final NdkPaths ndkPaths;
+ private final StlImpl stlImpl;
+
+ MipsCrosstools(NdkPaths ndkPaths, StlImpl stlImpl) {
+ this.ndkPaths = ndkPaths;
+ this.stlImpl = stlImpl;
+ }
+
+ ImmutableList<CToolchain.Builder> createCrosstools() {
+ return ImmutableList.of(createMips64Toolchain(), createMipsToolchain());
+ }
+
+ private CToolchain.Builder createMips64Toolchain() {
+ CToolchain.Builder mips64Clang =
+ createBaseMipsClangToolchain("mips64el")
+ .setToolchainIdentifier("mips64el-linux-android-clang3.8")
+ .setTargetSystemName("mips64el-linux-android")
+ .setTargetCpu("mips64")
+ .addAllToolPath(
+ ndkPaths.createClangToolpaths(
+ "mips64el-linux-android-4.9",
+ "mips64el-linux-android",
+ null,
+ CppConfiguration.Tool.DWP))
+ .setBuiltinSysroot(ndkPaths.createBuiltinSysroot("mips64"));
+
+ //List<CToolchain.Builder> toolchains = toolchainsListBuilder.build();
+ ndkPaths.addToolchainIncludePaths(
+ mips64Clang, "mips64el-linux-android-4.9", "mips64el-linux-android", "4.9.x");
+ stlImpl.addStlImpl(mips64Clang, "4.9");
+ return mips64Clang;
+ }
+
+ private CToolchain.Builder createMipsToolchain() {
+ CToolchain.Builder mipsClang =
+ createBaseMipsClangToolchain("mipsel")
+ // Purposefully no hyphen between "clang" and clang version.
+ .setToolchainIdentifier("mipsel-linux-android-clang3.8")
+ .setTargetSystemName("mipsel-linux-android")
+ .setTargetCpu("mips")
+ .addAllToolPath(
+ ndkPaths.createClangToolpaths(
+ "mipsel-linux-android-4.9",
+ "mipsel-linux-android",
+ null,
+ CppConfiguration.Tool.DWP,
+ CppConfiguration.Tool.GCOVTOOL))
+ .setBuiltinSysroot(ndkPaths.createBuiltinSysroot("mips"));
+
+ ndkPaths.addToolchainIncludePaths(
+ mipsClang, "mipsel-linux-android-4.9", "mipsel-linux-android", "4.9.x");
+ stlImpl.addStlImpl(mipsClang, "4.9");
+
+ return mipsClang;
+ }
+
+ private CToolchain.Builder createBaseMipsClangToolchain(String mipsArch) {
+ String gccToolchain =
+ ndkPaths.createGccToolchainPath(String.format("%s-linux-android-4.9", mipsArch));
+
+ String llvmTriple = mipsArch + "-none-linux-android";
+
+ return CToolchain.newBuilder()
+ .setCompiler("clang3.8")
+
+ // Compiler flags
+ .addCompilerFlag("-gcc-toolchain")
+ .addCompilerFlag(gccToolchain)
+ .addCompilerFlag("-target")
+ .addCompilerFlag(llvmTriple)
+ .addCompilerFlag("-fpic")
+ .addCompilerFlag("-fno-strict-aliasing")
+ .addCompilerFlag("-finline-functions")
+ .addCompilerFlag("-ffunction-sections")
+ .addCompilerFlag("-funwind-tables")
+ .addCompilerFlag("-fmessage-length=0")
+ .addCompilerFlag("-Wno-invalid-command-line-argument")
+ .addCompilerFlag("-Wno-unused-command-line-argument")
+ .addCompilerFlag("-no-canonical-prefixes")
+
+ // Linker flags
+ .addLinkerFlag("-gcc-toolchain")
+ .addLinkerFlag(gccToolchain)
+ .addLinkerFlag("-target")
+ .addLinkerFlag(llvmTriple)
+ .addLinkerFlag("-no-canonical-prefixes")
+
+ // Additional release flags
+ .addCompilationModeFlags(
+ CompilationModeFlags.newBuilder()
+ .setMode(CompilationMode.OPT)
+ .addCompilerFlag("-O2")
+ .addCompilerFlag("-g")
+ .addCompilerFlag("-DNDEBUG"))
+
+ // Additional debug flags
+ .addCompilationModeFlags(
+ CompilationModeFlags.newBuilder()
+ .setMode(CompilationMode.DBG)
+ .addCompilerFlag("-O0")
+ .addCompilerFlag("-g"));
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/NdkMajorRevisionR13.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/NdkMajorRevisionR13.java
new file mode 100644
index 0000000000..dff1a4ad07
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/NdkMajorRevisionR13.java
@@ -0,0 +1,36 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r13;
+
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.ApiLevel;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkMajorRevision;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkPaths;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpl;
+import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CrosstoolRelease;
+
+/** Logic specific to Android NDK R13. */
+public class NdkMajorRevisionR13 implements NdkMajorRevision {
+ @Override
+ public CrosstoolRelease crosstoolRelease(
+ NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) {
+ return AndroidNdkCrosstoolsR13.create(ndkPaths, stlImpl, hostPlatform);
+ }
+
+ @Override
+ public ApiLevel apiLevel(EventHandler eventHandler, String name, String apiLevel) {
+ return new ApiLevelR13(eventHandler, name, apiLevel);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/X86Crosstools.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/X86Crosstools.java
new file mode 100644
index 0000000000..b7b863f01a
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r13/X86Crosstools.java
@@ -0,0 +1,111 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r13;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.NdkPaths;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.StlImpl;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CompilationMode;
+import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CompilationModeFlags;
+
+/**
+ * Crosstool definitions for x86. These values are based on the setup.mk files in the Android NDK
+ * toolchain directories.
+ */
+final class X86Crosstools {
+ private final NdkPaths ndkPaths;
+ private final StlImpl stlImpl;
+
+ X86Crosstools(NdkPaths ndkPaths, StlImpl stlImpl) {
+ this.ndkPaths = ndkPaths;
+ this.stlImpl = stlImpl;
+ }
+
+ ImmutableList<CToolchain.Builder> createCrosstools() {
+ /** x86 */
+ // clang
+ CToolchain.Builder x86Clang =
+ createBaseX86ClangToolchain("x86", "i686")
+ // Workaround for https://code.google.com/p/android/issues/detail?id=220159.
+ .addCompilerFlag("-mstackrealign")
+ .setToolchainIdentifier("x86-clang3.8")
+ .setTargetCpu("x86")
+ .addAllToolPath(ndkPaths.createClangToolpaths("x86-4.9", "i686-linux-android", null))
+ .setBuiltinSysroot(ndkPaths.createBuiltinSysroot("x86"));
+
+ ndkPaths.addToolchainIncludePaths(x86Clang, "x86-4.9", "i686-linux-android", "4.9.x");
+ stlImpl.addStlImpl(x86Clang, "4.9");
+
+ /** x86_64 */
+ CToolchain.Builder x8664Clang =
+ createBaseX86ClangToolchain("x86_64", "x86_64")
+ .setToolchainIdentifier("x86_64-clang3.8")
+ .setTargetCpu("x86_64")
+ .addAllToolPath(
+ ndkPaths.createClangToolpaths("x86_64-4.9", "x86_64-linux-android", null))
+ .setBuiltinSysroot(ndkPaths.createBuiltinSysroot("x86_64"));
+
+ ndkPaths.addToolchainIncludePaths(x8664Clang, "x86_64-4.9", "x86_64-linux-android", "4.9.x");
+ stlImpl.addStlImpl(x8664Clang, "4.9");
+
+ return ImmutableList.of(x86Clang, x8664Clang);
+ }
+
+ private CToolchain.Builder createBaseX86ClangToolchain(String x86Arch, String llvmArch) {
+ String gccToolchain = ndkPaths.createGccToolchainPath(x86Arch + "-4.9");
+ String llvmTriple = llvmArch + "-none-linux-android";
+
+ return CToolchain.newBuilder()
+ .setCompiler("clang3.8")
+
+ // Compiler flags
+ .addCompilerFlag("-gcc-toolchain")
+ .addCompilerFlag(gccToolchain)
+ .addCompilerFlag("-target")
+ .addCompilerFlag(llvmTriple)
+ .addCompilerFlag("-ffunction-sections")
+ .addCompilerFlag("-funwind-tables")
+ .addCompilerFlag("-fstack-protector-strong")
+ .addCompilerFlag("-fPIC")
+ .addCompilerFlag("-Wno-invalid-command-line-argument")
+ .addCompilerFlag("-Wno-unused-command-line-argument")
+ .addCompilerFlag("-no-canonical-prefixes")
+
+ // Linker flags
+ .addLinkerFlag("-gcc-toolchain")
+ .addLinkerFlag(gccToolchain)
+ .addLinkerFlag("-target")
+ .addLinkerFlag(llvmTriple)
+ .addLinkerFlag("-no-canonical-prefixes")
+
+ // Additional release flags
+ .addCompilationModeFlags(
+ CompilationModeFlags.newBuilder()
+ .setMode(CompilationMode.OPT)
+ .addCompilerFlag("-O2")
+ .addCompilerFlag("-g")
+ .addCompilerFlag("-DNDEBUG"))
+
+ // Additional debug flags
+ .addCompilationModeFlags(
+ CompilationModeFlags.newBuilder()
+ .setMode(CompilationMode.DBG)
+ .addCompilerFlag("-O0")
+ .addCompilerFlag("-g"))
+
+ .setTargetSystemName("x86-linux-android");
+ }
+}