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_ENABLE_MLIR=OFF",
                        "-DIREE_BUILD_TESTS=OFF",
                        "-DIREE_BUILD_SAMPLES=OFF",
                        "-DIREE_BUILD_PYTHON_BINDINGS=OFF",
                        "-DIREE_HOST_BINARY_ROOT=${hostInstallDir}"
            }
        }
    }

    sourceSets {
        main {
            java.srcDirs = ['java/org/tensorflow/lite']
            jni.srcDirs = ['java/org/tensorflow/lite/native']
            manifest.srcFile 'org/tensorflow/lite/tests/TestManifest.xml'
        }
    }

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

// 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
