aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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
-rw-r--r--src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstoolsTest.java13
21 files changed, 838 insertions, 110 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");
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstoolsTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstoolsTest.java
index 0ef73f3659..09c369904d 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstoolsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/AndroidNdkCrosstoolsTest.java
@@ -24,9 +24,8 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r10e.AndroidNdkCrosstoolsR10e;
-import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r10e.ApiLevelR10e;
-import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r12.ApiLevelR12;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r10e.NdkMajorRevisionR10;
+import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r12.NdkMajorRevisionR12;
import com.google.devtools.build.lib.events.NullEventHandler;
import com.google.devtools.build.lib.util.ResourceFileLoader;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain;
@@ -43,7 +42,7 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
-/** Tests for {@link AndroidNdkCrosstoolsR10e}. */
+/** Tests for {@link AndroidNdkCrosstools}. */
@RunWith(Parameterized.class)
public class AndroidNdkCrosstoolsTest {
private static final String HOST_PLATFORM = "linux-x86_64";
@@ -103,7 +102,8 @@ public class AndroidNdkCrosstoolsTest {
return ImmutableList.of(
new AndroidNdkCrosstoolsTestParams[] {
new AndroidNdkCrosstoolsTestParams(
- new ApiLevelR10e(NullEventHandler.INSTANCE, REPOSITORY_NAME, "21"),
+ new NdkMajorRevisionR10()
+ .apiLevel(NullEventHandler.INSTANCE, REPOSITORY_NAME, "21"),
NdkRelease.create("r10e (64-bit)"),
"ndkfiles.txt",
"ndkdirectories.txt"
@@ -111,7 +111,8 @@ public class AndroidNdkCrosstoolsTest {
},
new AndroidNdkCrosstoolsTestParams[] {
new AndroidNdkCrosstoolsTestParams(
- new ApiLevelR12(NullEventHandler.INSTANCE, REPOSITORY_NAME, "21"),
+ new NdkMajorRevisionR12()
+ .apiLevel(NullEventHandler.INSTANCE, REPOSITORY_NAME, "21"),
NdkRelease.create("Pkg.Desc = Android NDK\nPkg.Revision = 12.1.297705\n"),
"ndk12bfiles.txt",
"ndk12bdirectories.txt"