#!/usr/bin/env python

# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See http://swift.org/LICENSE.txt for license information
# See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
#

import sys
import os
import argparse
import json
import glob

from lib.config import Configuration

from lib.path import Path

from lib.phases import CompileSources
from lib.phases import CompileSwiftSources
from lib.phases import CopyResources
from lib.phases import CopyHeaders
from lib.phases import SwiftExecutable

from lib.product import DynamicLibrary
from lib.product import Framework
from lib.product import StaticLibrary
from lib.product import Application
from lib.product import Executable

from lib.script import Script

from lib.target import ArchSubType
from lib.target import ArchType
from lib.target import EnvironmentType
from lib.target import ObjectFormat
from lib.target import OSType
from lib.target import Target
from lib.target import Vendor

from lib.workspace import Workspace

import sys

def reconfigure(config, path):
    with open(path, 'r') as infile:
        info = json.load(infile)
        if 'version' in info and info['version'] == config.version:
            if 'command' in info and info['command'] is not None:
                config.command = info['command']
            if 'project' in info and info['project'] is not None:
                config.command = info['project']
            if 'script_path' in info and info['script_path'] is not None:
                config.script_path = Path(info['script_path'])
            if 'build_script_path' in info and info['build_script_path'] is not None:
                config.build_script_path = Path(info['build_script_path'])
            if 'source_root' in info and info['source_root'] is not None:
                config.source_root = Path(info['source_root'])
            if 'target' in info and info['target'] is not None:
                config.target = Target(info['target'])
            if 'system_root' in info and info['system_root'] is not None:
                config.system_root = Path(info['system_root'])
            if 'toolchain' in info and info['toolchain'] is not None:
                config.toolchain = info['toolchain']
            if 'build_directory' in info and info['build_directory'] is not None:
                config.build_directory = Path(info['build_directory'])
            if 'intermediate_directory' in info and info['intermediate_directory'] is not None:
                config.intermediate_directory = Path(info['intermediate_directory'])
            if 'module_cache_directory' in info and info['module_cache_directory'] is not None:
                config.module_cache_directory = Path(info['module_cache_directory'])
            if 'install_directory' in info and info['install_directory'] is not None:
                config.install_directory = Path(info['install_directory'])
            if 'prefix' in info and info['prefix'] is not None:
                config.prefix = info['prefix']
            if 'swift_install' in info and info['swift_install'] is not None:
                config.swift_install = info['swift_install']
            if 'clang' in info and info['clang'] is not None:
                config.clang = info['clang']
            if 'clangxx' in info and info['clangxx'] is not None:
                config.clangxx = info['clangxx']
            if 'swift' in info and info['swift'] is not None:
                config.swift = info['swift']
            if 'swiftc' in info and info['swiftc'] is not None:
                config.swiftc = info['swiftc']
            if 'ar' in info and info['ar'] is not None:
                config.ar = info['ar']
            if 'swift_sdk' in info and info['swift_sdk'] is not None:
                config.swift_sdk = info['swift_sdk']
            if 'bootstrap_directory' in info and info['bootstrap_directory'] is not None:
                config.bootstrap_directory = Path(info['bootstrap_directory'])
            if 'verbose' in info and info['verbose'] is not None:
                config.verbose = info['verbose']
            if 'extra_c_flags' in info and info['extra_c_flags'] is not None:
                config.extra_c_flags = info['extra_c_flags']
            if 'extra_swift_flags' in info and info['extra_swift_flags'] is not None:
                config.extra_swift_flags = info['extra_swift_flags']
            if 'extra_ld_flags' in info and info['extra_ld_flags'] is not None:
                config.extra_ld_flags = info['extra_ld_flags']
            if 'build_mode' in info and info['build_mode'] is not None:
                config.build_mode = info['build_mode']
            if 'variables' in info and info['variables'] is not None:
                config.variables = info['variables']
        else:
            sys.exit("invalid version")


def main():
    config = Configuration()
    CWD                           = Path.path(os.getcwd())
    config.build_directory        = Path.path(os.getenv("BUILD_DIR", os.path.join(os.path.dirname(os.path.abspath(__file__)), "Build")))
    config.module_cache_directory = Path.path(os.getenv("BUILD_DIR", config.build_directory.path_by_appending("ModuleCache")))
    config.intermediate_directory = Path.path(os.getenv("INTERMEDIATE_DIR", config.build_directory.path_by_appending("Intermediates")))
    config.install_directory      = Path.path(os.getenv("DSTROOT", "/"))
    config.prefix                 = os.getenv("PREFIX", "/usr")
    config.clang                  = os.getenv("CLANG", "clang")
    config.clangxx                = os.getenv("CLANGXX", "clang")
    config.swift                  = os.getenv("SWIFT", "swift")
    config.swiftc                 = os.getenv("SWIFTC", "swiftc")
    config.ar                     = os.getenv("AR", None)
    config.source_root            = Path.path(os.getenv("SRCROOT", CWD))
    config.extra_c_flags          = os.getenv("CFLAGS", "")
    config.extra_swift_flags      = os.getenv("SWIFTCFLAGS", "")
    config.extra_ld_flags         = os.getenv("LDFLAGS", "")
    config.swift_sdk              = os.getenv("SDKROOT", None)
    config.script_path            = config.source_root.path_by_appending("build.py")
    config.build_script_path      = config.source_root.path_by_appending("build.ninja")
    config.config_path            = config.source_root.path_by_appending(".configuration")

    parser = argparse.ArgumentParser(description='Configure and emit ninja build scripts for building.')
    parser.add_argument('--target', dest='target', type=str, default=Target.default())
    parser.add_argument('--sysroot', dest='sysroot', type=str, default=None)
    parser.add_argument('--toolchain', dest='toolchain', type=str, default=None)
    parser.add_argument('--bootstrap', dest='bootstrap', type=str, default=os.path.join(os.path.dirname(os.path.abspath(__file__)), "bootstrap"))
    parser.add_argument('--reconfigure', dest='reconfigure', action="store_true")
    parser.add_argument('-v', '--verbose', dest='verbose', action="store_true")
    args, extras = parser.parse_known_args()
    
    if args.reconfigure:
        reconfigure(config, config.config_path.absolute())
        for arg in extras:
            if arg.lower() == 'debug':
                config.build_mode = Configuration.Debug
            elif arg.lower() == 'release':
                config.build_mode = Configuration.Release
    else:
        config.build_mode = Configuration.Debug # by default build in debug mode

        for arg in extras:
            if arg.lower() == 'debug':
                config.build_mode = Configuration.Debug
            elif arg.lower() == 'release':
                config.build_mode = Configuration.Release
            elif arg.startswith('-D'): # accept -DNAME=value as extra parameters to the configuration of the build.ninja
                key, val = arg[2:].split("=", 1)
                config.variables[key] = val

        config.command = [os.path.abspath(__file__)] + sys.argv[1:]

        config.target = Target(args.target)

        config.system_root = Path.path(args.sysroot)
        if config.target.sdk == OSType.MacOSX and config.system_root is None and Target(Target.default()).sdk == OSType.MacOSX:
            import subprocess
            config.system_root = Path.path(subprocess.Popen(['xcrun', '--show-sdk-path'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE).communicate()[0])
            swift_path = Path.path(subprocess.Popen(['xcrun', '--find', 'swift'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE).communicate()[0]).parent().parent()
            config.swift_sdk = swift_path.absolute()
        elif config.swift_sdk is None:
            config.swift_sdk = "/usr"
        config.toolchain = Path.path(args.toolchain)
        config.bootstrap_directory = Path.path(args.bootstrap)
        config.verbose = args.verbose
        if config.toolchain is not None:
            config.ar = os.path.join(config.toolchain.relative(), "bin", "ar")
        elif config.ar is None:
            config.ar = "ar"

    config.write(config.config_path.absolute())
    Configuration.current = config

    exec(compile(open(config.script_path.absolute()).read(), config.script_path.absolute(), 'exec'))


if __name__ == "__main__":
    main()

