
// General gradle arguments for root project
buildscript {    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        //
        // https://developer.android.com/studio/releases/gradle-plugin
        //
        // Notice that 3.3.0 here is the version of [Android Gradle Plugin]
        // Accroding to URL above you will need Gradle 5.0 or higher
        //
        // If you are using Android Studio, and it is using Gradle's lower 
        // version, Use the plugin version 3.1.3 ~ 3.2.0 for Gradle 4.4 ~ 4.10
        classpath 'com.android.tools.build:gradle:3.3.0'
    }
}
repositories {
    google()
    jcenter()
}
    
// Output: Shared library (.so) for Android 
apply plugin: 'com.android.library'

android {
    compileSdkVersion 25    // Android 7.0

    // Target ABI
    //  - This option controls target platform of module
    //  - The platform might be limited by compiler's support
    //    some can work with Clang(default), but some can work only with GCC...
    //    if bad, both toolchains might not support it
    splits {
        abi {
            enable true
            // Specify platforms for Application
            reset()
            include  "arm64-v8a", "armeabi-v7a", "x86_64"
        }
    }

    defaultConfig {
        minSdkVersion 21    // Android 5.0+
        targetSdkVersion 25 // Follow Compile SDK
        versionCode 21      // Follow release count
        versionName "5.3.0" // Follow Official version
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_STL=c++_shared"    // Specify Android STL
                arguments "-DBUILD_SHARED_LIBS=true"    // Build shared object
                arguments "-DFMT_TEST=false"            // Skip test
                arguments "-DFMT_DOC=false"             // Skip document
                cppFlags  "-std=c++17"
            }
        }
        println("Gradle CMake Plugin: ")
        println(externalNativeBuild.cmake.cppFlags)
        println(externalNativeBuild.cmake.arguments)
    }

    // External Native build
    //  - Use existing CMakeList.txt
    //  - Give path to CMake. This gradle file should be 
    //    neighbor of the top level cmake
    externalNativeBuild {
        cmake {
            path "../CMakeLists.txt"
            // buildStagingDirectory "./build"  // Custom path for cmake output
        }
        //println(cmake.path)
    }
    
    sourceSets{
        // Android Manifest for Gradle
        main {
            manifest.srcFile 'AndroidManifest.xml'
        }
    }
}

assemble.doLast
{
    // Instead of `ninja install`, Gradle will deploy the files.
    // We are doing this since FMT is dependent to the ANDROID_STL after build
    copy {
        from 'build/intermediates/cmake'
        into '../libs'
    }
    // Copy debug binaries
    copy {
        from '../libs/debug/obj'
        into '../libs/debug'
    }
    // Copy Release binaries
    copy {
        from '../libs/release/obj'
        into '../libs/release'
    }
    // Remove empty directory
    delete '../libs/debug/obj'
    delete '../libs/release/obj'
}
