/*
* 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.build.gradle.internal.NdkHandler;
import com.android.build.gradle.internal.core.Abi;
import com.android.build.gradle.internal.core.Toolchain;
import org.gradle.api.Action;
import org.gradle.nativeplatform.platform.NativePlatform;
import org.gradle.nativeplatform.toolchain.Clang;
import org.gradle.nativeplatform.toolchain.Gcc;
import org.gradle.nativeplatform.toolchain.GccCompatibleToolChain;
import org.gradle.nativeplatform.toolchain.GccPlatformToolChain;
import org.gradle.nativeplatform.toolchain.NativeToolChainRegistry;
import org.gradle.platform.base.PlatformContainer;
import java.util.Collections;
import java.util.List;
/**
* Action to configure toolchain for native binaries.
*/
public class ToolchainConfiguration {
public static void configurePlatforms(PlatformContainer platforms, NdkHandler ndkHandler) {
for (Abi abi : ndkHandler.getSupportedAbis()) {
NativePlatform platform = platforms.maybeCreate(abi.getName(), NativePlatform.class);
// All we care is the name of the platform. It doesn't matter what the
// architecture is, but it must be set to non-x86 so that it does not match
// the default supported platform.
platform.architecture("ppc");
platform.operatingSystem("linux");
}
}
/**
* Configure toolchain for a platform.
*/
public static void configureToolchain(
NativeToolChainRegistry toolchainRegistry,
final String toolchainName,
final NdkHandler ndkHandler) {
final Toolchain ndkToolchain = Toolchain.getByName(toolchainName);
toolchainRegistry.create("ndk-" + toolchainName,
toolchainName.equals("gcc") ? Gcc.class : Clang.class,
new Action<GccCompatibleToolChain>() {
@Override
public void execute(GccCompatibleToolChain toolchain) {
// Configure each platform.
for (Abi it : ndkHandler.getSupportedAbis()) {
final Abi abi = it;
toolchain.target(abi.getName(), new Action<GccPlatformToolChain>() {
@Override
public void execute(GccPlatformToolChain targetPlatform) {
if (Toolchain.GCC.equals(ndkToolchain)) {
String gccPrefix = abi.getGccExecutablePrefix();
targetPlatform.getcCompiler()
.setExecutable(gccPrefix + "-gcc");
targetPlatform.getCppCompiler()
.setExecutable(gccPrefix + "-g++");
targetPlatform.getLinker()
.setExecutable(gccPrefix + "-g++");
targetPlatform.getAssembler()
.setExecutable(gccPrefix + "-as");
targetPlatform.getStaticLibArchiver()
.setExecutable(gccPrefix + "-ar");
}
// By default, gradle will use -Xlinker to pass arguments to the linker.
// Removing it as it prevents -sysroot from being properly set.
targetPlatform.getLinker().withArguments(
new Action<List<String>>() {
@Override
public void execute(List<String> args) {
args.removeAll(Collections.singleton("-Xlinker"));
}
});
}
});
toolchain.path(ndkHandler.getCCompiler(abi).getParentFile());
}
}
});
}
}