repositories {
    google()
    jcenter()
}

buildscript {
    repositories {
        google()
        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_EXPERIMENTAL_JAVA_BINDINGS=ON",
                        "-DIREE_HAL_DRIVERS_TO_BUILD=VMLA",

                        // 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/com/google/iree']
            jni.srcDirs = ['java/com/google/iree/native']
            manifest.srcFile 'com/google/iree/tests/TestManifest.xml'
        }
    }

    externalNativeBuild {
        cmake {
            version "3.13.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=vmla",
            "-DIREE_HAL_DRIVERS_TO_BUILD=vmla",
            "-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
