summaryrefslogtreecommitdiff
path: root/platform/android/gradle/native-build.gradle
blob: 0c16c379ddea3e20e13ffe916015c477b2aa0521 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
ext.nativeBuild = { nativeTargets ->
    android {
        defaultPublishConfig project.hasProperty("mapbox.buildtype") ? project.getProperty("mapbox.buildtype") : "debug"

        // We sometimes want to invoke Gradle without building a native dependency, e.g. when we just want
        // to invoke the Java tests. When we explicitly specify an ABI of 'none', no native dependencies are
        // added. When another ABI is specified explicitly, we're just going to build that ABI. In all other
        // cases, all ABIs are built.
        //
        // When invoking from the command line or to override the device default, set `-Pmapbox.abis=...` to
        // only build the desired architectures.
        //
        // When building from Android Studio, gradle.properties sets `android.buildOnlyTargetAbi=true` so that
        // only the architecture for the device you're running on gets built.
        def abi = 'all'
        if (!project.hasProperty('android.injected.invoked.from.ide') || project.hasProperty("mapbox.abis")) {
            // Errors when the user invokes Gradle from the command line and didn't set mapbox.abis
            abi = project.getProperty("mapbox.abis")
        }

        if (abi != 'none') {
            externalNativeBuild {
                cmake {
                    path "../../../CMakeLists.txt"
                    version "3.10.2"
                }
            }
        }

        // Allow determining the C++ STL we're using when building Mapbox GL.
        def stl = 'c++_static'
        if (project.hasProperty("mapbox.stl")) {
            stl = project.getProperty("mapbox.stl")
        }

        defaultConfig {
            if (abi != 'none') {
                externalNativeBuild {
                    cmake {
                        arguments "-DANDROID_TOOLCHAIN=clang"
                        arguments "-DANDROID_STL=" + stl
                        arguments "-DANDROID_CPP_FEATURES=exceptions"
                        arguments "-DMBGL_PLATFORM=android"
                        arguments "-DMASON_PLATFORM=android"
                        arguments "-DNodeJS_EXECUTABLE=" + node
                        arguments "-Dnpm_EXECUTABLE=" + npm

                        // Enable ccache if the user has installed it.
                        if (ccache?.trim()) {
                            arguments "-DANDROID_CCACHE=" + ccache
                        }

                        cFlags "-Qunused-arguments"
                        cppFlags "-Qunused-arguments"

                        for (target in nativeTargets) {
                            targets target
                        }

                        if (abi != 'all') {
                            abiFilters abi.split(' ')
                        } else {
                            abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
                        }
                    }
                }
            }
        }
    }
}