repositories {
    google()
    jcenter()
}

buildscript {
    repositories {
        google()
        // TODO: jcenter will soon go away. Find a replacement: https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.0'
    }
}

apply plugin: 'com.android.library'

def cmakeListDir = "${rootDir}/../../../"
def hostBuildDir = "${cmakeListDir}/../iree-build-host"
def hostInstallDir = "${hostBuildDir}/install"

android {
    compileSdkVersion 29
    defaultConfig {
        minSdkVersion 28
        targetSdkVersion 29

        externalNativeBuild {
            cmake {
                arguments "-DIREE_BUILD_BINDINGS_TFLITE=ON",
                        "-DIREE_BUILD_BINDINGS_TFLITE_JAVA=ON",
                        "-DIREE_HAL_DRIVERS_TO_BUILD=VMVX",

                        // Disable all but the runtime components needed for the
                        // java bindings.
                        "-DIREE_BUILD_COMPILER=OFF",
                        "-DIREE_BUILD_TESTS=OFF",
                        "-DIREE_BUILD_SAMPLES=OFF",
                        "-DIREE_BUILD_PYTHON_BINDINGS=OFF",
                        "-DIREE_HOST_BINARY_ROOT=${hostInstallDir}"

                targets "iree-tflite-bindings"
            }
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'org/tensorflow/lite/AndroidManifest.xml'
            java {
                srcDirs('org/tensorflow/lite')
                exclude('tests/**') // Don't build tests into the library
            }
            jni.srcDirs = ['org/tensorflow/lite/native']
        }
    }

    externalNativeBuild {
        cmake {
            version "3.13.4.0+"
            path "../../../CMakeLists.txt"
        }
    }
}

dependencies {
    implementation 'com.android.support:support-annotations:22.2.0'
}

// Task to cmake configure the host
task cmakeConfigureHost(type: Exec) {
    doFirst {
        println "Configuring host tools with cmake..."
    }
    workingDir cmakeListDir
    commandLine "cmake",
            "-G" , "Ninja",
            "-B", hostBuildDir ,
            "-DIREE_TARGET_BACKENDS_TO_BUILD=vmvx",
            "-DIREE_HAL_DRIVERS_TO_BUILD=vmvx",
            "-DIREE_BUILD_COMPILER=ON",
            "-DIREE_BUILD_TESTS=OFF ",
            "-DIREE_BUILD_SAMPLES=OFF",
            "-DCMAKE_INSTALL_PREFIX=${hostInstallDir}",
            "."
}

// Task to cmake build the host
task cmakeBuildHost(type: Exec) {
    doFirst {
        println "Building host tools with cmake..."
    }
    workingDir cmakeListDir
    commandLine "cmake", "--build", hostBuildDir, "--target", "install"
}

// Build host tools before building the app
preBuild.dependsOn cmakeBuildHost
cmakeBuildHost.dependsOn cmakeConfigureHost
