diff options
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" |