blob: 6c5c9ea84f6c3f04aaf1ac42a6a7d28195baf29c [file] [log] [blame]
/*
* Copyright (C) 2016 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.internal.dsl;
import com.android.annotations.NonNull;
import java.util.List;
import java.util.Set;
/**
* Base interface for CMake per-variant info.
*/
public interface CoreExternalNativeCmakeOptions {
/**
* Specifies arguments for CMake.
*
* <p>The following sample enables NEON support and tells CMake to use the Clang compiler
* toolchain:
*
* <pre>
* android {
* // Similar to other properties in the defaultConfig block, you can override
* // these properties for each product flavor you configure.
* defaultConfig {
* externalNativeBuild {
* cmake {
* // Passes optional arguments to CMake.
* arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
* }
* }
* }
* }
* </pre>
*
* <p>By default, this property is <code>null</code>. For a list of properties you can
* configure, see <a href="https://developer.android.com/ndk/guides/cmake.html#variables">CMake
* Variables List</a>.
*
* @since 2.2.0
*/
@NonNull
List<String> getArguments();
/**
* Specifies flags for the C compiler.
*
* <p>The following sample enables format macro constants:
*
* <pre>
* android {
* // Similar to other properties in the defaultConfig block, you can override
* // these properties for each product flavor in your build configuration.
* defaultConfig {
* externalNativeBuild {
* cmake {
* // Sets an optional flag for the C compiler.
* cFlags "-D__STDC_FORMAT_MACROS"
* }
* }
* }
* }
* </pre>
*
* <p>By default, this property is <code>null</code>.
*
* @since 2.2.0
*/
@NonNull
List<String> getcFlags();
/**
* Specifies flags for the C++ compiler.
*
* <p>The following sample enables RTTI (RunTime Type Information) support and C++ exceptions:
*
* <pre>
* android {
* // Similar to other properties in the defaultConfig block, you can override
* // these properties for each product flavor in your build configuration.
* defaultConfig {
* externalNativeBuild {
* cmake {
* // Sets optional flags for the C++ compiler.
* cppFlags "-fexceptions", "-frtti"
* }
* }
* }
* }
* </pre>
*
* <p>By default, this property is <code>null</code>.
*
* @since 2.2.0
*/
@NonNull
List<String> getCppFlags();
/**
* Specifies the Application Binary Interfaces (ABI) that Gradle should build outputs for. The
* ABIs that Gradle packages into your APK are determined by {@link
* com.android.build.gradle.internal.dsl.NdkOptions#abiFilter
* android.defaultConfig.ndk.abiFilter}
*
* <p>In most cases, you need to specify ABIs using only {@link
* com.android.build.gradle.internal.dsl.NdkOptions#abiFilter
* android.defaultConfig.ndk.abiFilter} , because it tells Gradle which ABIs to both build and
* package into your APK. However, if you want to control what Gradle should build,
* independently of what you want it to package into your APK, configure this property with the
* ABIs you want Gradle to build.
*
* <p>To further reduce the size of your APK, consider <a
* href="https://developer.android.com/studio/build/configure-apk-splits.html#configure-abi-split">configuring
* multiple APKs based on ABI</a>—instead of creating one large APK with all versions of your
* native libraries, Gradle creates a separate APK for each ABI you want to support and only
* packages the files each ABI needs.
*
* <p>By default, this property is <code>null</code>.
*
* @since 2.2.0
*/
@NonNull
Set<String> getAbiFilters();
/**
* Specifies the library and executable targets from your CMake project that Gradle should
* build.
*
* <p>For example, if your CMake project defines multiple libraries and executables, you can
* tell Gradle to build only a subset of those outputs as follows:
*
* <pre>
* android {
* // Similar to other properties in the defaultConfig block, you can override
* // these properties for each product flavor in your build configuration.
* defaultConfig {
* externalNativeBuild {
* cmake {
* // The following tells Gradle to build only the "libexample-one.so" and
* // "my-executible-two" targets from the linked CMake project. If you don't
* // configure this property, Gradle builds all executables and shared object
* // libraries that you define in your CMake project. However, Gradle packages
* // only shared libraries into your APK.
* targets "libexample-one",
* // You need to specify this executable and its sources in your
* // CMakeLists.txt using the add_executable() CMake command. However,
* // building executables from your native sources is optional, and
* // building native libraries to package into your APK satisfies most
* // project requirements.
* "my-executible-demo"
* }
* }
* }
* }
* </pre>
*
* <p>If you don't configure this property, Gradle builds all executables and shared object
* libraries that you define in your CMake project. However, by default, Gradle packages only
* the shared libraries in your APK.
*
* @since 2.2.0
*/
@NonNull
Set<String> getTargets();
}