# -*- coding: utf-8 -*-

#-------------------------------------------------------------------------
# drawElements Quality Program utilities
# --------------------------------------
#
# Copyright 2015 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#-------------------------------------------------------------------------

import os
from build.common import *
from build.build import *
from argparse import ArgumentParser
import multiprocessing
from build_android_mustpass import *

class LaunchControlConfig:
    def __init__ (self, buildArgs, checkMustpassLists):
        self.buildArgs = buildArgs
        self.checkMustpassLists = checkMustpassLists

    def getBuildArgs (self):
        return self.buildArgs

    def getCheckMustpassLists (self):
        return self.checkMustpassLists

COMMON_GCC_CFLAGS = ["-Werror"]
COMMON_CLANG_CFLAGS = COMMON_GCC_CFLAGS + ["-Wno-error=unused-command-line-argument"]
X86_64_GCC_CFLAGS = COMMON_GCC_CFLAGS + ["-m64"]
X86_64_CLANG_CFLAGS = COMMON_CLANG_CFLAGS + ["-m64"]

def makeCflagsArgs (cflags):
    cflagsStr = " ".join(cflags)
    return ["-DCMAKE_C_FLAGS=%s" % cflagsStr, "-DCMAKE_CXX_FLAGS=%s" % cflagsStr]

BUILD_CONFIGS = {
    "gcc-x86_64-x11_glx":   LaunchControlConfig(["-DDEQP_TARGET=x11_glx"] + makeCflagsArgs(X86_64_GCC_CFLAGS), False),
    "clang-x86_64-x11_glx": LaunchControlConfig(["-DDEQP_TARGET=x11_glx", "-DCMAKE_C_COMPILER=clang", "-DCMAKE_CXX_COMPILER=clang++"] + makeCflagsArgs(X86_64_CLANG_CFLAGS), False),
    "gcc-x86_64-null": LaunchControlConfig(["-DDEQP_TARGET=null"] + makeCflagsArgs(X86_64_GCC_CFLAGS), True)
}

def buildWithMake (workingDir):
    pushWorkingDir(workingDir)
    # CMake docs advised this to be the best magic formula...
    threadCount = multiprocessing.cpu_count() + 1
    print("Invoke make with %d threads" % threadCount)
    execute(["make", "-j%d" % threadCount])
    popWorkingDir()

def checkForChanges ():
    pushWorkingDir(DEQP_DIR)
    # If there are changed files, exit code will be non-zero and the script terminates immediately.
    execute(["git", "diff", "--exit-code"])
    popWorkingDir()

def parseOptions ():
    parser = ArgumentParser()

    parser.add_argument("-d",
                        "--build-dir",
                        dest="buildDir",
                        default="out",
                        help="Temporary build directory")
    parser.add_argument("-c",
                        "--config",
                        dest="config",
                        choices=BUILD_CONFIGS.keys(),
                        required=True,
                        help="Build configuration name")
    parser.add_argument("-t",
                        "--build-type",
                        dest="buildType",
                        choices=["Debug", "Release"],
                        default="Debug",
                        help="Build type")
    return parser.parse_args()

if __name__ == "__main__":
    options = parseOptions()

    print("\n############################################################")
    print("# %s %s BUILD" % (options.config.upper(), options.buildType.upper()))
    print("############################################################\n")

    launchControlConfig = BUILD_CONFIGS[options.config]
    buildDir = os.path.realpath(os.path.normpath(options.buildDir))
    config = BuildConfig(buildDir, options.buildType, launchControlConfig.getBuildArgs())
    initBuildDir(config, MAKEFILE_GENERATOR)
    buildWithMake(buildDir)

    if launchControlConfig.getCheckMustpassLists():
        genMustpassLists(MUSTPASS_LISTS, MAKEFILE_GENERATOR, config)
        checkForChanges()

    print("\n--- BUILD SCRIPT COMPLETE")
