""" Copies the build output of a custom python interpreter to a directory
    structure that mirrors that of an official Python distribution.

    --------------------------------------------------------------------------
    File:           install_custom_python.py

    Overview:       Most users build LLDB by linking against the standard
                    Python distribution installed on their system.  Occasionally
                    a user may want to build their own version of Python, and on
                    platforms such as Windows this is a hard requirement.  This
                    script will take the build output of a custom interpreter and
                    install it into a canonical structure that mirrors that of an
                    official Python distribution, thus allowing PYTHONHOME to be
                    set appropriately.

    Gotchas:        None.

    Copyright:      None.
    --------------------------------------------------------------------------

"""

import argparse
import itertools
import os
import shutil
import sys

def copy_one_file(dest_dir, source_dir, filename):
    source_path = os.path.join(source_dir, filename)
    dest_path = os.path.join(dest_dir, filename)
    print 'Copying file %s ==> %s...' % (source_path, dest_path)
    shutil.copyfile(source_path, dest_path)

def copy_named_files(dest_dir, source_dir, files, extensions, copy_debug_suffix_also):
    for (file, ext) in itertools.product(files, extensions):
        copy_one_file(dest_dir, source_dir, file + '.' + ext)
        if copy_debug_suffix_also:
            copy_one_file(dest_dir, source_dir, file + '_d.' + ext)

def copy_subdirectory(dest_dir, source_dir, subdir):
    dest_dir = os.path.join(dest_dir, subdir)
    source_dir = os.path.join(source_dir, subdir)
    print 'Copying directory %s ==> %s...' % (source_dir, dest_dir)
    shutil.copytree(source_dir, dest_dir)

def copy_distro(dest_dir, dest_subdir, source_dir, source_prefix):
    dest_dir = os.path.join(dest_dir, dest_subdir)

    print 'Copying distribution %s ==> %s' % (source_dir, dest_dir)

    os.mkdir(dest_dir)
    PCbuild_dir = os.path.join(source_dir, 'PCbuild')
    if source_prefix:
        PCbuild_dir = os.path.join(PCbuild_dir, source_prefix)
    # First copy the files that go into the root of the new distribution. This
    # includes the Python executables, python27(_d).dll, and relevant PDB files.
    print 'Copying Python executables...'
    copy_named_files(dest_dir, PCbuild_dir, ['w9xpopen'], ['exe', 'pdb'], False)
    copy_named_files(dest_dir, PCbuild_dir, ['python_d', 'pythonw_d'], ['exe'], False)
    copy_named_files(dest_dir, PCbuild_dir, ['python', 'pythonw'], ['exe', 'pdb'], False)
    copy_named_files(dest_dir, PCbuild_dir, ['python27'], ['dll', 'pdb'], True)

    # Next copy everything in the Include directory.
    print 'Copying Python include directory'
    copy_subdirectory(dest_dir, source_dir, 'Include')

    # Copy Lib folder (builtin Python modules)
    print 'Copying Python Lib directory'
    copy_subdirectory(dest_dir, source_dir, 'Lib')

    # Copy tools folder.  These are probably not necessary, but we copy them anyway to
    # match an official distribution as closely as possible.  Note that we don't just copy
    # the subdirectory recursively.  The source distribution ships with many more tools
    # than what you get by installing python regularly.  We only copy the tools that appear
    # in an installed distribution.
    tools_dest_dir = os.path.join(dest_dir, 'Tools')
    tools_source_dir = os.path.join(source_dir, 'Tools')
    os.mkdir(tools_dest_dir)
    copy_subdirectory(tools_dest_dir, tools_source_dir, 'i18n')
    copy_subdirectory(tools_dest_dir, tools_source_dir, 'pynche')
    copy_subdirectory(tools_dest_dir, tools_source_dir, 'scripts')
    copy_subdirectory(tools_dest_dir, tools_source_dir, 'versioncheck')
    copy_subdirectory(tools_dest_dir, tools_source_dir, 'webchecker')

    pyd_names = ['_ctypes', '_ctypes_test', '_elementtree', '_multiprocessing', '_socket',
                 '_testcapi', 'pyexpat', 'select', 'unicodedata', 'winsound']

    # Copy builtin extension modules (pyd files)
    dlls_dir = os.path.join(dest_dir, 'DLLs')
    os.mkdir(dlls_dir)
    print 'Copying DLLs directory'
    copy_named_files(dlls_dir, PCbuild_dir, pyd_names, ['pyd', 'pdb'], True)

    # Copy libs folder (implibs for the pyd files)
    libs_dir = os.path.join(dest_dir, 'libs')
    os.mkdir(libs_dir)
    print 'Copying libs directory'
    copy_named_files(libs_dir, PCbuild_dir, pyd_names, ['lib'], False)
    copy_named_files(libs_dir, PCbuild_dir, ['python27'], ['lib'], True)


parser = argparse.ArgumentParser(description='Install a custom Python distribution')
parser.add_argument('--source', required=True, help='The root of the source tree where Python is built.')
parser.add_argument('--dest', required=True, help='The location to install the Python distributions.')
parser.add_argument('--overwrite', default=False, action='store_true', help='If the destination directory already exists, destroys its contents first.')
parser.add_argument('--silent', default=False, action='store_true', help='If --overwite was specified, suppress confirmation before deleting a directory tree.')

args = parser.parse_args()

args.source = os.path.normpath(args.source)
args.dest = os.path.normpath(args.dest)

if not os.path.exists(args.source):
    print 'The source directory %s does not exist.  Exiting...'
    sys.exit(1)

if os.path.exists(args.dest):
    if not args.overwrite:
        print 'The destination directory \'%s\' already exists and --overwrite was not specified.  Exiting...' % args.dest
        sys.exit(1)
    while not args.silent:
        print 'Ok to recursively delete \'%s\' and all contents (Y/N)?  Choosing Y will permanently delete the contents.' % args.dest
        result = str.upper(sys.stdin.read(1))
        if result == 'N':
            print 'Unable to copy files to the destination.  The destination already exists.'
            sys.exit(1)
        elif result == 'Y':
            break
    shutil.rmtree(args.dest)

os.mkdir(args.dest)
copy_distro(args.dest, 'x86', args.source, None)
copy_distro(args.dest, 'x64', args.source, 'amd64')
