llvm-project/llvm/utils/gn/build/symlink_or_copy.py
Nico Weber f4d5b14dcc [gn] Give two scripts argparse.RawDescriptionHelpFormatter
Without this, the doc string is put in a single line. These
scripts have multi-line docstrings, so this makes their --help
output look much nicer.

Otherwise, no behavior change.
2024-08-09 11:10:12 -04:00

53 lines
1.5 KiB
Python
Executable File

#!/usr/bin/env python3
"""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__,
formatter_class=argparse.RawDescriptionHelpFormatter)
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())