apply plugin: 'sdk-files'

import com.android.tools.internal.emulator.BuildEmulator

// Get SDK revision to define emulator revision
File fprops = new File(rootDir.getParentFile(), 'external/qemu/source.properties')
Properties props = new Properties()
props.load(fprops.newDataInputStream())

task buildDefaultEmulator(type: BuildEmulator) {
    revision = props."Pkg.Revision"
    build_number = System.getenv("BUILD_NUMBER")
    output = new File(project.buildDir, "default")
}

task buildWindowsEmulator(type: BuildEmulator) {
    revision = props."Pkg.Revision"
    build_number = System.getenv("BUILD_NUMBER")
    output = new File(project.buildDir, "windows")
    windows = true
}

sdk {
    common(mac, linux) {
        item(fprops) {
            notice null
        }
        item('android/android-emu/android/avd/hardware-properties.ini') {
            into 'lib'
            notice null
        }
        item("$buildDefaultEmulator.output/emulator") {
            executable true
            builtBy buildDefaultEmulator
        }
        item("$buildDefaultEmulator.output/emulator-check") {
            executable true
            builtBy buildDefaultEmulator
        }
        item("$buildDefaultEmulator.output/bin64") {
            into 'bin64'
            builtBy buildDefaultEmulator
        }
        item("$buildDefaultEmulator.output/qemu") {
            into 'qemu'
            builtBy buildDefaultEmulator
        }
        item("$buildDefaultEmulator.output/build/debug_info/qemu") {
            into 'qemu'
            builtBy buildDefaultEmulator
            debug true
        }
        item("$buildDefaultEmulator.output/lib") {
            into 'lib'
            builtBy buildDefaultEmulator
        }
        item("$buildDefaultEmulator.output/lib64") {
            into 'lib64'
            builtBy buildDefaultEmulator
        }
        item("$buildDefaultEmulator.output/build/debug_info/lib64") {
            into 'lib64'
            builtBy buildDefaultEmulator
            debug true
        }
        item("$project.rootDir/../prebuilts/qemu-kernel/x86/pc-bios/bios.bin") {
            into 'lib/pc-bios'
        }
        item("$project.rootDir/../prebuilts/qemu-kernel/x86/pc-bios/vgabios-cirrus.bin") {
            into 'lib/pc-bios'
        }

        item("$buildDefaultEmulator.output/emulator64-arm") {
            executable true
            builtBy buildDefaultEmulator
        }

        item("$buildDefaultEmulator.output/emulator64-mips") {
            executable true
            builtBy buildDefaultEmulator
        }

        item("$buildDefaultEmulator.output/emulator64-x86") {
            executable true
            builtBy buildDefaultEmulator
        }

        item("$buildDefaultEmulator.output/emulator64-crash-service") {
            executable true
            builtBy buildDefaultEmulator
        }
    }

    windows {
        item(fprops) {
            notice null
        }
        item('android/android-emu/android/avd/hardware-properties.ini') {
            into 'lib'
            notice null
        }
        item("$buildWindowsEmulator.output/emulator.exe") {
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/emulator-check.exe") {
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/bin") {
            into 'bin'
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/qemu") {
            into 'qemu'
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/build/debug_info/qemu") {
            into 'qemu'
            builtBy buildWindowsEmulator
            debug true
        }
        item("$buildWindowsEmulator.output/lib") {
            into 'lib'
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/build/debug_info/lib") {
            into 'lib'
            builtBy buildWindowsEmulator
            debug true
        }
        item("$buildWindowsEmulator.output/lib64") {
            into 'lib64'
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/build/debug_info/lib64") {
            into 'lib64'
            builtBy buildWindowsEmulator
            debug true
        }
        item("$project.rootDir/../prebuilts/qemu-kernel/x86/pc-bios/bios.bin") {
            into 'lib/pc-bios'
        }
        item("$project.rootDir/../prebuilts/qemu-kernel/x86/pc-bios/vgabios-cirrus.bin") {
            into 'lib/pc-bios'
        }

        item("$buildWindowsEmulator.output/emulator-arm.exe") {
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/emulator-mips.exe") {
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/emulator-x86.exe") {
            builtBy buildWindowsEmulator
        }
        item("$buildWindowsEmulator.output/emulator-crash-service.exe") {
            builtBy buildWindowsEmulator
        }

        item("$buildWindowsEmulator.output/emulator64-crash-service.exe") {
            builtBy buildWindowsEmulator
        }

/*
XAV(2014-06-17): DISABLE win64 exe until it's ready
        item("$buildWindowsEmulator.output/emulator64-arm.exe") {
            builtBy buildWindowsEmulator
        }

        item("$buildWindowsEmulator.output/emulator64-mips.exe") {
            builtBy buildWindowsEmulator
        }

        item("$buildWindowsEmulator.output/emulator64-x86.exe") {
            builtBy buildWindowsEmulator
        }

*/
    }
}

import com.android.tools.internal.sdk.base.PlatformConfig
import com.android.tools.internal.sdk.base.ToolItem
import com.google.common.collect.Lists
// Duplicate 'emulator' executables for debug info paths
for (PlatformConfig platform : sdk.getPlatforms()) {
    def itemlist = Lists.newArrayList()
    for (ToolItem toolitem: platform.getItems()) {
        if (toolitem.getDebug() || !toolitem.getExecutable()) {
            continue
        }
        def prop = toolitem.properties
        def itemPath = prop.itemPath
        if (itemPath instanceof String || itemPath instanceof GString) {
            def debugItemPath = itemPath
            def path = debugItemPath.split("/")
            def s = path[path.size()-1]
            if (!s.contains("emulator")) {
                continue
            }
            if (platform.getName().equals("win")) {
                debugItemPath = debugItemPath.replaceFirst("$buildWindowsEmulator.output",
                                "$buildWindowsEmulator.output/build/debug_info")
            } else {
                debugItemPath = debugItemPath.replaceFirst("$buildDefaultEmulator.output",
                                "$buildDefaultEmulator.output/build/debug_info")
            }
            if (debugItemPath.equals(itemPath)) {
                continue
            }
            if (platform.getName().equals("mac")) {
                debugItemPath += ".dSYM"
                if (!prop.destinationPath) {
                    path = debugItemPath.split("/")
                    prop.destinationPath = path[path.size()-1]
                }

            }
            prop.debug=true;
            prop.remove('itemPath')
            prop.remove('class')
            def propcopy = {
                prop.each { k, v ->
                    delegate."$k"=v
                }
                return debugItemPath
            }
            def debugitem = new ToolItem(propcopy)
            propcopy.delegate = debugitem
            itemlist.add(debugitem)
        }

    }
    for (ToolItem debugitem: itemlist) {
        platform.getItems().add(debugitem)
    }
}
