/*
* Copyright (C) 2015 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.model;
import com.android.annotations.NonNull;
import com.android.build.gradle.internal.NdkHandler;
import com.android.build.gradle.internal.core.Abi;
import com.android.build.gradle.internal.dsl.CoreNdkOptions;
import com.android.build.gradle.internal.model.NativeLibraryFactory;
import com.android.build.gradle.internal.model.NativeLibraryImpl;
import com.android.build.gradle.internal.scope.VariantScope;
import com.android.build.gradle.internal.variant.BaseVariantData;
import com.android.build.gradle.internal.variant.BaseVariantOutputData;
import com.android.build.gradle.ndk.internal.BinaryToolHelper;
import com.android.builder.model.NativeLibrary;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import org.gradle.nativeplatform.NativeLibraryBinarySpec;
import org.gradle.platform.base.BinaryContainer;
import java.io.File;
import java.util.Collections;
/**
* Implementation of NativeLibraryFactory from in the component model plugin.
*
* The library extract information directly from the binaries.
*/
public class ComponentNativeLibraryFactory implements NativeLibraryFactory {
BinaryContainer binaries;
NdkHandler ndkHandler;
public ComponentNativeLibraryFactory(BinaryContainer binaries,
NdkHandler ndkHandler) {
this.binaries = binaries;
this.ndkHandler = ndkHandler;
}
@NonNull
@Override
public Optional<NativeLibrary> create(
@NonNull VariantScope scope,
@NonNull String toolchainName,
@NonNull final Abi abi) {
BaseVariantData<? extends BaseVariantOutputData> variantData = scope.getVariantData();
DefaultAndroidBinary androidBinary =
(DefaultAndroidBinary) binaries.findByName(variantData.getName());
if (androidBinary == null) {
// Binaries are not created for test variants.
return Optional.absent();
}
@SuppressWarnings("ConstantConditions")
Optional<NativeLibraryBinarySpec> nativeBinary =
Iterables.tryFind(androidBinary.getNativeBinaries(),
new Predicate<NativeLibraryBinarySpec>() {
@Override
public boolean apply(NativeLibraryBinarySpec binary) {
return binary.getTargetPlatform().getName().equals(abi.getName());
}
});
if (!nativeBinary.isPresent()) {
// We don't have native binaries.
return Optional.absent();
}
CoreNdkOptions ndkConfig = variantData.getVariantConfiguration().getNdkConfig();
// The DSL currently do not support all options available in the model such as the
// include dirs and the defines. Therefore, just pass an empty collection for now.
return Optional.<NativeLibrary>of(new NativeLibraryImpl(
ndkConfig.getModuleName(),
toolchainName,
abi.getName(),
Collections.<File>emptyList(), /*cIncludeDirs*/
Collections.<File>emptyList(), /*cppIncludeDirs*/
Collections.<File>emptyList(), /*cSystemIncludeDirs*/
ndkHandler.getStlIncludes(ndkConfig.getStl(), abi),
Collections.<String>emptyList(), /*cDefines*/
Collections.<String>emptyList(), /*cppDefines*/
BinaryToolHelper.getCCompiler(nativeBinary.get()).getArgs(),
BinaryToolHelper.getCppCompiler(nativeBinary.get()).getArgs(),
ImmutableList.of(variantData.getScope().getNdkDebuggableLibraryFolders(abi))));
}
}