#!/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)
        config.requires_pkg_config = info['requires_pkg_config']
        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 = Path(info['toolchain'])
            if 'linker' in info and info['linker'] is not None:
                config.linker = info['linker']
            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 'pkg_config' in info and info['pkg_config'] is not None:
                config.pkg_config = info['pkg_config']
            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(), help="specify the deployment target")
    parser.add_argument('--sysroot', dest='sysroot', type=str, default=None, help="the system root directory for building")
    parser.add_argument('--toolchain', dest='toolchain', type=str, default=None, help="the base location for finding tools to compile")
    parser.add_argument('--linker', dest='linker', type=str, default=None, help="which linker program to use")
    parser.add_argument('--pkg-config', dest='pkg_config', type=str, default="pkg-config")
    parser.add_argument('--bootstrap', dest='bootstrap', type=str, default=os.path.join(os.path.dirname(os.path.abspath(__file__)), "bootstrap"), help="a directory for bootstrapping commonly used headers and libraries not associated directly with the target operating system")
    parser.add_argument('--reconfigure', dest='reconfigure', action="store_true", help="re-generate the build script given the previous configuration")
    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.pkg_config = args.pkg_config
        config.linker = args.linker
        config.bootstrap_directory = Path.path(args.bootstrap)
        config.verbose = args.verbose
        if config.toolchain is not None:
            ar_path = os.path.join(config.toolchain.relative(), "ar")
            if not os.path.exists(ar_path):
                ar_path = os.path.join(config.toolchain.relative(), "bin", "ar")
            config.ar = ar_path
        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()

