diff options
author | Jingwen Chen <jingwen@google.com> | 2018-07-17 19:02:09 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-07-17 19:03:59 -0700 |
commit | 61a6bea12cf785f605c84af6c85844b0bb8c1775 (patch) | |
tree | 6d96f990267de473247057eda952ff3a84f41f44 /src/main/java/com/google/devtools/build/lib/bazel | |
parent | 6b5205b000fe391faf12f84ed4f2e9ea38ae81ff (diff) |
Android NDK r17 support
[Full NDK changelog](https://github.com/android-ndk/ndk/wiki/Changelog-r17)
Changes related to Bazel's NDK toolchain/CROSSTOOL generation:
- Removed support for targeting mips, mips64, armeabi.
- Bumped bundled clang version to 6.0.2.
- The default STL is now libc++. If Bazel detects that r17 is being used, it
aliases `@androidndk//:default_toolchain` to `@androidndk//:toolchain-libcpp`,
instead of `@androidndk//:toolchain-gnu-libstdcpp`.
- Removed tests that build against armeabi, mips, mips64.
- Stop passing `-fno-integrated-as` into the compiler by default.
TODO:
- [x] Java tests
- [x] ~Support for wrap.sh to use with ASANs~ Implementing in follow up PR.
- [ ] Fix or disable remote caching with android_ndk_integration_test https://github.com/bazelbuild/bazel/issues/4663
Fixes https://github.com/bazelbuild/bazel/issues/4742
RELNOTES: Added support for Android NDK r17. The default STL is now `libc++`, and support for targeting `mips`, `mips64` and `ARMv5` (`armeabi`) has been removed.
Closes #5371.
Change-Id: Id1ded004c3a80ea62f307746dc3ad6f633f2df2e
PiperOrigin-RevId: 205013758
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/bazel')
6 files changed, 511 insertions, 0 deletions
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 c5aedb7df5..8823899c05 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 @@ -21,6 +21,7 @@ import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r11.NdkMa 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.bazel.rules.android.ndkcrosstools.r15.NdkMajorRevisionR15; +import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.r17.NdkMajorRevisionR17; import com.google.devtools.build.lib.util.OS; import java.util.Map; @@ -46,6 +47,7 @@ public final class AndroidNdkCrosstools { // The only difference between r15 and r16 is that old headers are removed, forcing // usage of the unified headers. Support for unified headers were added in r15. .put(16, new NdkMajorRevisionR15("5.0.300080")) // no changes relevant to Bazel + .put(17, new NdkMajorRevisionR17("6.0.2")) .build(); public static final Map.Entry<Integer, NdkMajorRevision> LATEST_KNOWN_REVISION = diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/AndroidNdkCrosstoolsR17.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/AndroidNdkCrosstoolsR17.java new file mode 100644 index 0000000000..fca2b82a09 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/AndroidNdkCrosstoolsR17.java @@ -0,0 +1,109 @@ +// Copyright 2018 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.r17; + +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; + +/** Generates a CrosstoolRelease proto for the Android NDK. */ +final class AndroidNdkCrosstoolsR17 { + + /** + * 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, String clangVersion) { + return CrosstoolRelease.newBuilder() + .setMajorVersion("android") + .setMinorVersion("") + .setDefaultTargetCpu("armeabi") + .addAllDefaultToolchain(getDefaultCpuToolchains(stlImpl, clangVersion)) + .addAllToolchain(createToolchains(ndkPaths, stlImpl, hostPlatform, clangVersion)) + .build(); + } + + private static ImmutableList<CToolchain> createToolchains( + NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform, String clangVersion) { + + List<CToolchain.Builder> toolchainBuilders = new ArrayList<>(); + toolchainBuilders.addAll(new ArmCrosstools(ndkPaths, stlImpl, clangVersion).createCrosstools()); + toolchainBuilders.addAll(new X86Crosstools(ndkPaths, stlImpl, clangVersion).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. + // platforms/arch sysroot + toolchainBuilder.addCxxBuiltinIncludeDirectory("%sysroot%/usr/include"); + // unified headers sysroot, from ndk15 and up + toolchainBuilder.addCxxBuiltinIncludeDirectory( + ndkPaths.createBuiltinSysroot() + "/usr/include"); + toolchainBuilder.addUnfilteredCxxFlag( + "-isystem%ndk%/usr/include".replace("%ndk%", ndkPaths.createBuiltinSysroot())); + + toolchains.add(toolchainBuilder.build()); + } + + return toolchains.build(); + } + + private static ImmutableList<DefaultCpuToolchain> getDefaultCpuToolchains( + StlImpl stlImpl, String clangVersion) { + // TODO(bazel-team): It would be better to auto-generate this somehow. + + ImmutableMap<String, String> defaultCpus = + ImmutableMap.<String, String>builder() + // arm + .put("armeabi-v7a", "arm-linux-androideabi-clang" + clangVersion + "-v7a") + .put("arm64-v8a", "aarch64-linux-android-clang" + clangVersion) + + // x86 + .put("x86", "x86-clang" + clangVersion) + .put("x86_64", "x86_64-clang" + clangVersion) + .build(); + + ImmutableList.Builder<DefaultCpuToolchain> defaultCpuToolchains = ImmutableList.builder(); + for (Map.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/r17/ApiLevelR17.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/ApiLevelR17.java new file mode 100644 index 0000000000..0ee13cce9a --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/ApiLevelR17.java @@ -0,0 +1,69 @@ +// Copyright 2018 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.r17; + +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 ApiLevelR17 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("14", "arm", "x86") + .putAll("15", "arm", "x86") + .putAll("16", "arm", "x86") + .putAll("17", "arm", "x86") + .putAll("18", "arm", "x86") + .putAll("19", "arm", "x86") + .putAll("21", "arm", "x86", "arm64", "x86_64") + .putAll("22", "arm", "x86", "arm64", "x86_64") + .putAll("23", "arm", "x86", "arm64", "x86_64") + .putAll("24", "arm", "x86", "arm64", "x86_64") + .putAll("26", "arm", "x86", "arm64", "x86_64") + .putAll("27", "arm", "x86", "arm64", "x86_64") + .putAll("28", "arm", "x86", "arm64", "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("10", "14") + .put("11", "14") + .put("12", "14") + .put("13", "14") + .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") + .put("26", "26") + .put("27", "27") + .put("28", "28") + .build(); + + ApiLevelR17(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/r17/ArmCrosstools.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/ArmCrosstools.java new file mode 100644 index 0000000000..eb6a0fec7f --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/ArmCrosstools.java @@ -0,0 +1,171 @@ +// Copyright 2018 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.r17; + +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 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; + private final String clangVersion; + + ArmCrosstools(NdkPaths ndkPaths, StlImpl stlImpl, String clangVersion) { + this.ndkPaths = ndkPaths; + this.stlImpl = stlImpl; + this.clangVersion = clangVersion; + } + + ImmutableList<CToolchain.Builder> createCrosstools() { + CToolchain.Builder aarch64Toolchain = createAarch64ClangToolchain(); + CToolchain.Builder armeabiToolchain = createArmeabiClangToolchain(); + + stlImpl.addStlImpl(aarch64Toolchain, "4.9"); + stlImpl.addStlImpl(armeabiToolchain, "4.9"); + + return ImmutableList.<CToolchain.Builder>builder() + .add(aarch64Toolchain) + .add(armeabiToolchain) + .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"; + + return CToolchain.newBuilder() + .setToolchainIdentifier("aarch64-linux-android-clang" + clangVersion) + .setTargetSystemName(targetPlatform) + .setTargetCpu("arm64-v8a") + .setCompiler("clang" + clangVersion) + .addAllToolPath(ndkPaths.createClangToolpaths(toolchainName, targetPlatform, null)) + .addCxxBuiltinIncludeDirectory( + ndkPaths.createClangToolchainBuiltinIncludeDirectory(clangVersion)) + .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") + .addCompilerFlag( + "-isystem%ndk%/usr/include/%triple%" + .replace("%ndk%", ndkPaths.createBuiltinSysroot()) + .replace("%triple%", targetPlatform)) + .addCompilerFlag("-D__ANDROID_API__=" + ndkPaths.getCorrectedApiLevel("arm")) + + // 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")); + } + + private CToolchain.Builder createArmeabiClangToolchain() { + String toolchainName = "arm-linux-androideabi-4.9"; + String targetPlatform = "arm-linux-androideabi"; + String gccToolchain = ndkPaths.createGccToolchainPath("arm-linux-androideabi-4.9"); + + return CToolchain.newBuilder() + .setToolchainIdentifier("arm-linux-androideabi-clang" + clangVersion + "-v7a") + .setTargetCpu("armeabi-v7a") + .setTargetSystemName("arm-linux-androideabi") + .setCompiler("clang" + clangVersion) + .addAllToolPath(ndkPaths.createClangToolpaths(toolchainName, targetPlatform, null)) + .addCxxBuiltinIncludeDirectory( + ndkPaths.createClangToolchainBuiltinIncludeDirectory(clangVersion)) + .setBuiltinSysroot(ndkPaths.createBuiltinSysroot("arm")) + .addCompilerFlag("-D__ANDROID_API__=" + ndkPaths.getCorrectedApiLevel("arm")) + .addCompilerFlag( + "-isystem%ndk%/usr/include/%triple%" + .replace("%ndk%", ndkPaths.createBuiltinSysroot()) + .replace("%triple%", targetPlatform)) + + // Compiler flags + .addCompilerFlag("-target") + .addCompilerFlag("armv7-none-linux-androideabi") // LLVM_TRIPLE + .addCompilerFlag("-march=armv7-a") + .addCompilerFlag("-mfloat-abi=softfp") + .addCompilerFlag("-mfpu=vfpv3-d16") + .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") + + // Linker flags + .addLinkerFlag("-target") + .addLinkerFlag("armv7-none-linux-androideabi") // LLVM_TRIPLE + .addLinkerFlag("-Wl,--fix-cortex-a8") + .addLinkerFlag("-gcc-toolchain") + .addLinkerFlag(gccToolchain) + .addLinkerFlag("-no-canonical-prefixes") + + // Additional release flags + .addCompilationModeFlags( + CompilationModeFlags.newBuilder() + .setMode(CompilationMode.OPT) + .addCompilerFlag("-mthumb") + .addCompilerFlag("-Os") + .addCompilerFlag("-g") + .addCompilerFlag("-DNDEBUG")) + + // Additional debug flags + .addCompilationModeFlags( + CompilationModeFlags.newBuilder() + .setMode(CompilationMode.DBG) + .addCompilerFlag("-g") + .addCompilerFlag("-fno-strict-aliasing") + .addCompilerFlag("-O0") + .addCompilerFlag("-UNDEBUG")); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/NdkMajorRevisionR17.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/NdkMajorRevisionR17.java new file mode 100644 index 0000000000..e730b99fcb --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/NdkMajorRevisionR17.java @@ -0,0 +1,42 @@ +// Copyright 2018 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.r17; + +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 R17. */ +public class NdkMajorRevisionR17 implements NdkMajorRevision { + private final String clangVersion; + + public NdkMajorRevisionR17(String clangVersion) { + this.clangVersion = clangVersion; + } + + @Override + public CrosstoolRelease crosstoolRelease( + NdkPaths ndkPaths, StlImpl stlImpl, String hostPlatform) { + return AndroidNdkCrosstoolsR17.create(ndkPaths, stlImpl, hostPlatform, clangVersion); + } + + @Override + public ApiLevel apiLevel(EventHandler eventHandler, String name, String apiLevel) { + return new ApiLevelR17(eventHandler, name, apiLevel); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/X86Crosstools.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/X86Crosstools.java new file mode 100644 index 0000000000..e2887b8e70 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/r17/X86Crosstools.java @@ -0,0 +1,118 @@ +// Copyright 2018 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.r17; + +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; + private final String clangVersion; + + X86Crosstools(NdkPaths ndkPaths, StlImpl stlImpl, String clangVersion) { + this.ndkPaths = ndkPaths; + this.stlImpl = stlImpl; + this.clangVersion = clangVersion; + } + + ImmutableList<CToolchain.Builder> createCrosstools() { + /** x86 */ + // clang + CToolchain.Builder x86Clang = + createBaseX86ClangToolchain("x86", "i686", "i686-linux-android") + // Workaround for https://code.google.com/p/android/issues/detail?id=220159. + .addCompilerFlag("-mstackrealign") + .setToolchainIdentifier("x86-clang" + clangVersion) + .setTargetCpu("x86") + .addAllToolPath(ndkPaths.createClangToolpaths("x86-4.9", "i686-linux-android", null)) + .setBuiltinSysroot(ndkPaths.createBuiltinSysroot("x86")); + + stlImpl.addStlImpl(x86Clang, "4.9"); + + /** x86_64 */ + CToolchain.Builder x8664Clang = + createBaseX86ClangToolchain("x86_64", "x86_64", "x86_64-linux-android") + .setToolchainIdentifier("x86_64-clang" + clangVersion) + .setTargetCpu("x86_64") + .addAllToolPath( + ndkPaths.createClangToolpaths("x86_64-4.9", "x86_64-linux-android", null)) + .setBuiltinSysroot(ndkPaths.createBuiltinSysroot("x86_64")); + + stlImpl.addStlImpl(x8664Clang, "4.9"); + + return ImmutableList.of(x86Clang, x8664Clang); + } + + private CToolchain.Builder createBaseX86ClangToolchain( + String x86Arch, String llvmArch, String triple) { + String gccToolchain = ndkPaths.createGccToolchainPath(x86Arch + "-4.9"); + String llvmTriple = llvmArch + "-none-linux-android"; + + return CToolchain.newBuilder() + .setCompiler("clang" + clangVersion) + .addCxxBuiltinIncludeDirectory( + ndkPaths.createClangToolchainBuiltinIncludeDirectory(clangVersion)) + + // 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") + .addCompilerFlag( + "-isystem%ndk%/usr/include/%triple%" + .replace("%ndk%", ndkPaths.createBuiltinSysroot()) + .replace("%triple%", triple)) + .addCompilerFlag("-D__ANDROID_API__=" + ndkPaths.getCorrectedApiLevel(x86Arch)) + + // 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"); + } +} |