blob: fc832835b010e309a317b7beaf2ae3cf925859d4 [file] [log] [blame]
// Copyright 2015 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.common.collect.ImmutableList;
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 x86. These values are based on the setup.mk files in the Android NDK
* toolchain directories.
*/
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() {
ImmutableList.Builder<CToolchain.Builder> toolchains = ImmutableList.builder();
/**
* x86
*/
// gcc 4.8
toolchains.add(createX86Toolchain("4.8", "-fstack-protector", CppConfiguration.Tool.GCOVTOOL));
// gcc 4.9
toolchains.add(createX86Toolchain("4.9", "-fstack-protector-strong"));
// Add Clang toolchains. x86 uses gcc-4.8.
for (String clangVersion : new String[] { "3.5", "3.6" }) {
CToolchain.Builder x86Clang = createBaseX86ClangToolchain("x86", "i686", "4.8", clangVersion)
.setToolchainIdentifier("x86-clang" + clangVersion)
.setTargetCpu("x86")
.addAllToolPath(ndkPaths.createClangToolpaths(
"x86-4.8", "i686-linux-android", clangVersion,
// gcc-4.8 x86 toolchain doesn't have gcov-tool.
CppConfiguration.Tool.GCOVTOOL))
.setBuiltinSysroot(ndkPaths.createBuiltinSysroot("x86"));
ndkPaths.addToolchainIncludePaths(x86Clang, "x86-4.8", "i686-linux-android", "4.8");
stlImpl.addStlImpl(x86Clang, "4.8");
toolchains.add(x86Clang);
}
/**
* x86_64
*/
CToolchain.Builder x8664 = createBaseX86Toolchain()
.setToolchainIdentifier("x86_64-4.9")
.setTargetCpu("x86_64")
.setCompiler("gcc-4.9")
.addAllToolPath(ndkPaths.createToolpaths(
"x86_64-4.9", "x86_64-linux-android"))
.setBuiltinSysroot(ndkPaths.createBuiltinSysroot("x86_64"))
.addCompilerFlag("-fstack-protector-strong");
ndkPaths.addToolchainIncludePaths(x8664, "x86_64-4.9", "x86_64-linux-android", "4.9");
stlImpl.addStlImpl(x8664, "4.9");
toolchains.add(x8664);
// Add Clang toolchains. x86_64 uses gcc-4.9.
for (String clangVersion : new String[] { "3.5", "3.6" }) {
CToolchain.Builder x8664Clang =
createBaseX86ClangToolchain("x86_64", "x86_64", "4.9", clangVersion)
.setToolchainIdentifier("x86_64-clang" + clangVersion)
.setTargetCpu("x86_64")
.addAllToolPath(ndkPaths.createClangToolpaths(
"x86_64-4.9", "x86_64-linux-android", clangVersion))
.setBuiltinSysroot(ndkPaths.createBuiltinSysroot("x86_64"));
ndkPaths.addToolchainIncludePaths(x8664Clang, "x86_64-4.9", "x86_64-linux-android", "4.9");
stlImpl.addStlImpl(x8664Clang, "4.9");
toolchains.add(x8664Clang);
}
ImmutableList<CToolchain.Builder> toolchainBuilders = toolchains.build();
// x86_64 also sets "x86-linux-android"
for (CToolchain.Builder toolchainBuilder : toolchainBuilders) {
toolchainBuilder.setTargetSystemName("x86-linux-android");
}
return toolchainBuilders;
}
private CToolchain.Builder createX86Toolchain(
String gccVersion, String stackProtrectorFlag, CppConfiguration.Tool... excludedTools) {
CToolchain.Builder toolchain = createBaseX86Toolchain()
.setToolchainIdentifier("x86-" + gccVersion)
.setTargetCpu("x86")
.setCompiler("gcc-" + gccVersion)
.addAllToolPath(ndkPaths.createToolpaths(
"x86-" + gccVersion, "i686-linux-android", excludedTools))
.setBuiltinSysroot(ndkPaths.createBuiltinSysroot("x86"))
.addCompilerFlag(stackProtrectorFlag);
ndkPaths.addToolchainIncludePaths(
toolchain, "x86-" + gccVersion, "i686-linux-android", gccVersion);
stlImpl.addStlImpl(toolchain, gccVersion);
return toolchain;
}
private CToolchain.Builder createBaseX86Toolchain() {
return CToolchain.newBuilder()
// Compiler flags
.addCompilerFlag("-ffunction-sections")
.addCompilerFlag("-funwind-tables")
.addCompilerFlag("-no-canonical-prefixes")
.addCompilerFlag("-fno-canonical-system-headers")
// Linker flags
.addLinkerFlag("-no-canonical-prefixes")
// Additional release flags
.addCompilationModeFlags(
CompilationModeFlags.newBuilder()
.setMode(CompilationMode.OPT)
.addCompilerFlag("-O2")
.addCompilerFlag("-g")
.addCompilerFlag("-DNDEBUG")
.addCompilerFlag("-fomit-frame-pointer")
.addCompilerFlag("-fstrict-aliasing")
.addCompilerFlag("-funswitch-loops")
.addCompilerFlag("-finline-limit=300"))
// Additional debug flags
.addCompilationModeFlags(
CompilationModeFlags.newBuilder()
.setMode(CompilationMode.DBG)
.addCompilerFlag("-O0")
.addCompilerFlag("-g")
.addCompilerFlag("-fno-omit-frame-pointer")
.addCompilerFlag("-fno-strict-aliasing"));
}
private CToolchain.Builder createBaseX86ClangToolchain(
String x86Arch, String llvmArch, String gccVersion, String clangVersion) {
String gccToolchain = ndkPaths.createGccToolchainPath(
String.format("%s-linux-android-%s", x86Arch, gccVersion));
String llvmTriple = llvmArch + "-none-linux-android";
return CToolchain.newBuilder()
.setCompiler("clang" + 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("-fno-canonical-system-headers")
// 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")
.addCompilerFlag("-fomit-frame-pointer")
.addCompilerFlag("-fstrict-aliasing"))
// Additional debug flags
.addCompilationModeFlags(CompilationModeFlags.newBuilder()
.setMode(CompilationMode.DBG)
.addCompilerFlag("-O0")
.addCompilerFlag("-g")
.addCompilerFlag("-fno-omit-frame-pointer")
.addCompilerFlag("-fnostrict-aliasing"));
}
}