#!/usr/bin/env python3

"""Helps manage sysroots."""

import argparse
import os
import subprocess
import sys


def make_fake_sysroot(out_dir):
    def cmdout(cmd):
        return subprocess.check_output(cmd).decode(sys.stdout.encoding).strip()

    if sys.platform == 'win32':
        p = os.getenv('ProgramFiles(x86)', 'C:\\Program Files (x86)')

        winsdk = os.getenv('WindowsSdkDir')
        if not winsdk:
            winsdk = os.path.join(p, 'Windows Kits', '10')
            print('%WindowsSdkDir% not set. You might want to run this from')
            print('a Visual Studio cmd prompt. Defaulting to', winsdk)

        vswhere = os.path.join(
                p, 'Microsoft Visual Studio', 'Installer', 'vswhere')
        vcid = 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64'
        vsinstalldir = cmdout(
                [vswhere, '-latest', '-products', '*', '-requires', vcid,
                    '-property', 'installationPath'])

        def mkjunction(dst, src):
            subprocess.check_call(['mklink', '/j', dst, src], shell=True)
        os.mkdir(out_dir)
        mkjunction(os.path.join(out_dir, 'VC'),
                   os.path.join(vsinstalldir, 'VC'))
        os.mkdir(os.path.join(out_dir, 'Windows Kits'))
        mkjunction(os.path.join(out_dir, 'Windows Kits', '10'), winsdk)
    elif sys.platform == 'darwin':
        assert False, "FIXME: Implement on darwin"
    else:
        os.symlink('/', out_dir)

    print('Done.')
    abs_out_dir = os.path.abspath(out_dir)
    if sys.platform == 'win32':
        # CMake doesn't like backslashes in commandline args.
        abs_out_dir = abs_out_dir.replace(os.path.sep, '/')
        print('Pass -DLLVM_WINSYSROOT=' + abs_out_dir + ' to cmake.')
    else:
        print('Pass -DCMAKE_SYSROOT=' + abs_out_dir + ' to cmake.')


def main():
    parser = argparse.ArgumentParser(description=__doc__)

    subparsers = parser.add_subparsers(dest='command', required=True)

    makefake = subparsers.add_parser('make-fake',
            help='Create a sysroot that symlinks to local directories.')
    makefake.add_argument('--out-dir', required=True)

    args = parser.parse_args()

    assert args.command == 'make-fake'
    make_fake_sysroot(args.out_dir)


if __name__ == '__main__':
    main()
