# -*- 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 ctsbuild.common import *
from ctsbuild.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")
