#!/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 StaticAndDynamicLibrary
from lib.product import Application
from lib.product import Executable

from lib.pkg_config import PkgConfig

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()

