/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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.android.build.gradle.ndk.internal;
import com.android.SdkConstants;
import com.android.build.gradle.internal.NdkHandler;
import com.android.build.gradle.internal.core.Abi;
import com.android.builder.core.BuilderConstants;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.ListMultimap;
import org.gradle.nativeplatform.BuildType;
import org.gradle.nativeplatform.platform.NativePlatform;
import java.util.Map;
/**
* Flag configuration for Clang toolchain.
*/
public class ClangNativeToolSpecification extends AbstractNativeToolSpecification {
private NdkHandler ndkHandler;
private NativePlatform platform;
private boolean isDebugBuild;
private static final Map<String, String> TARGET_TRIPLE = ImmutableMap.<String, String>builder()
.put(SdkConstants.ABI_INTEL_ATOM, "i686-none-linux-android")
.put(SdkConstants.ABI_INTEL_ATOM64, "x86_64-none-linux-android")
.put(SdkConstants.ABI_ARMEABI, "armv5-none-linux-android")
.put(SdkConstants.ABI_ARMEABI_V7A, "armv7-none-linux-android")
.put(SdkConstants.ABI_ARM64_V8A, "aarch64-none-linux-android")
.put(SdkConstants.ABI_MIPS, "mipsel-none-linux-android")
.put(SdkConstants.ABI_MIPS64, "mips64el-none-linux-android")
.build();
private static final ListMultimap<String, String> RELEASE_CFLAGS =
ImmutableListMultimap.<String, String>builder()
.putAll(SdkConstants.ABI_ARMEABI, ImmutableList.of(
"-fpic",
"-ffunction-sections",
"-funwind-tables",
"-fstack-protector",
"-no-canonical-prefixes",
"-march=armv5te",
"-mtune=xscale",
"-msoft-float",
"-mthumb",
"-Os",
"-DNDEBUG",
"-fomit-frame-pointer",
"-fstrict-aliasing"))
.putAll(SdkConstants.ABI_ARMEABI_V7A, ImmutableList.of(
"-fpic",
"-ffunction-sections",
"-funwind-tables",
"-fstack-protector",
"-no-canonical-prefixes",
"-march=armv7-a",
"-mfloat-abi=softfp",
"-mfpu=vfpv3-d16",
"-mthumb",
"-Os",
"-DNDEBUG",
"-fomit-frame-pointer",
"-fstrict-aliasing"))
.putAll(SdkConstants.ABI_ARM64_V8A, ImmutableList.of(
"-fpic",
"-ffunction-sections",
"-funwind-tables",
"-fstack-protector",
"-no-canonical-prefixes",
"-O2",
"-DNDEBUG",
"-fomit-frame-pointer",
"-fstrict-aliasing"))
.putAll(SdkConstants.ABI_INTEL_ATOM, ImmutableList.of(
"-ffunction-sections",
"-funwind-tables",
"-fstack-protector",
"-fPIC",
"-no-canonical-prefixes",
"-O2",
"-DNDEBUG",
"-fomit-frame-pointer",
"-fstrict-aliasing"))
.putAll(SdkConstants.ABI_INTEL_ATOM64, ImmutableList.of(
"-ffunction-sections",
"-funwind-tables",
"-fstack-protector",
"-fPIC",
"-no-canonical-prefixes",
"-O2",
"-DNDEBUG",
"-fomit-frame-pointer",
"-fstrict-aliasing"))
.putAll(SdkConstants.ABI_MIPS, ImmutableList.of(
"-fpic",
"-fno-strict-aliasing",
"-finline-functions",
"-ffunction-sections",
"-funwind-tables",
"-fmessage-length=0",
"-no-canonical-prefixes",
"-O2",
"-g",
"-DNDEBUG",
"-fomit-frame-pointer"))
.putAll(SdkConstants.ABI_MIPS64, ImmutableList.of(
"-fpic",
"-fno-strict-aliasing",
"-finline-functions",
"-ffunction-sections",
"-funwind-tables",
"-fmessage-length=0",
"-no-canonical-prefixes",
"-O2",
"-g",
"-DNDEBUG",
"-fomit-frame-pointer"))
.build();
private static final ListMultimap<String, String> DEBUG_CFLAGS =
ImmutableListMultimap.<String, String>builder()
.putAll(SdkConstants.ABI_ARMEABI, ImmutableList.of(
"-O0",
"-UNDEBUG",
"-marm",
"-fno-strict-aliasing",
"-fno-limit-debug-info"))
.putAll(SdkConstants.ABI_ARMEABI_V7A, ImmutableList.of(
"-O0",
"-UNDEBUG",
"-marm",
"-fno-strict-aliasing",
"-fno-limit-debug-info"))
.putAll(SdkConstants.ABI_ARM64_V8A, ImmutableList.of(
"-O0",
"-UNDEBUG",
"-fno-omit-frame-pointer",
"-fno-strict-aliasing",
"-fno-limit-debug-info"))
.putAll(SdkConstants.ABI_INTEL_ATOM, ImmutableList.of(
"-O0",
"-UNDEBUG",
"-fno-omit-frame-pointer",
"-fno-strict-aliasing",
"-fno-limit-debug-info"))
.putAll(SdkConstants.ABI_INTEL_ATOM64, ImmutableList.of(
"-O0",
"-UNDEBUG",
"-fno-omit-frame-pointer",
"-fno-strict-aliasing",
"-fno-limit-debug-info"))
.putAll(SdkConstants.ABI_MIPS, ImmutableList.of(
"-O0",
"-UNDEBUG",
"-fno-omit-frame-pointer",
"-fno-limit-debug-info"))
.putAll(SdkConstants.ABI_MIPS64, ImmutableList.of(
"-O0",
"-UNDEBUG",
"-fno-omit-frame-pointer",
"-fno-limit-debug-info"))
.build();
public ClangNativeToolSpecification(
NdkHandler ndkHandler,
NativePlatform platform,
boolean isDebugBuild) {
this.ndkHandler = ndkHandler;
this.isDebugBuild = isDebugBuild;
this.platform = platform;
}
@Override
public Iterable<String> getCFlags() {
return Iterables.concat(
getTargetFlags(),
RELEASE_CFLAGS.get(platform.getName()),
isDebugBuild ? DEBUG_CFLAGS.get(platform.getName()) : ImmutableList.<String>of());
}
@Override
public Iterable<String> getCppFlags() {
return getCFlags();
}
@Override
public Iterable<String> getLdFlags() {
return Iterables.concat(
getTargetFlags(),
platform.getName().equals(SdkConstants.ABI_ARMEABI_V7A)
? ImmutableList.of("-Wl,--fix-cortex-a8")
: ImmutableList.<String>of());
}
private Iterable<String> getTargetFlags() {
return ImmutableList.of(
"-gcc-toolchain",
ndkHandler.getDefaultGccToolchainPath(Abi.getByName(platform.getName())).toString(),
"-target",
TARGET_TRIPLE.get(platform.getName()));
}
}