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.2.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_DRIVER_DEFAULTS=OFF",
                        "-DIREE_HAL_DRIVER_LOCAL_TASK=ON",
                        "-DIREE_HAL_EXECUTABLE_LOADER_DEFAULTS=OFF",
                        "-DIREE_HAL_EXECUTABLE_LOADER_VMVX_MODULE=ON",
                        "-DIREE_HAL_EXECUTABLE_PLUGIN_DEFAULTS=OFF",

                        // 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_BIN_DIR=${hostInstallDir}/bin"

                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']
            jniLibs.srcDirs = ['jniLibs/']
        }
    }

    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_HAL_DRIVER_DEFAULTS=OFF",
            "-DIREE_HAL_DRIVER_LOCAL_TASK=ON",
            "-DIREE_HAL_EXECUTABLE_LOADER_DEFAULTS=OFF",
            "-DIREE_HAL_EXECUTABLE_LOADER_VMVX_MODULE=ON",
            "-DIREE_HAL_EXECUTABLE_PLUGIN_DEFAULTS=OFF",
            "-DIREE_BUILD_COMPILER=OFF",
            "-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
