#!/usr/bin/env python

"""Symlinks, or on Windows copies, an existing file to a second location.

Overwrites the target location if it exists.
Updates the mtime on a stamp file when done."""

import argparse
import errno
import os
import sys


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--stamp', required=True,
                        help='name of a file whose mtime is updated on run')
    parser.add_argument('source')
    parser.add_argument('output')
    args = parser.parse_args()

    # FIXME: This should not check the host platform but the target platform
    # (which needs to be passed in as an arg), for cross builds.
    if sys.platform != 'win32':
        try:
            os.makedirs(os.path.dirname(args.output))
        except OSError as e:
            if e.errno != errno.EEXIST:
                raise
        try:
            os.symlink(args.source, args.output)
        except OSError as e:
            if e.errno == errno.EEXIST:
                os.remove(args.output)
                os.symlink(args.source, args.output)
            else:
                raise
    else:
        import shutil
        output = args.output + ".exe"
        source = args.source + ".exe"
        shutil.copyfile(os.path.join(os.path.dirname(output), source), output)

    open(args.stamp, 'w') # Update mtime on stamp file.


if __name__ == '__main__':
    sys.exit(main())
