#!/usr/bin/env python
#===----------------------------------------------------------------------===##
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
#===----------------------------------------------------------------------===##

"""
Generate a linker script that links libc++ to the proper ABI library.
An example script for c++abi would look like "INPUT(libc++.so.1 -lc++abi)".
"""

import argparse
import os
import sys


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("--dryrun", help="Don't write any output",
                        action="store_true", default=False)
    parser.add_argument("--rename", action="store_true", default=False,
                        help="Rename the output as input so we can replace it")
    parser.add_argument("--input", help="Path to libc++ library", required=True)
    parser.add_argument("--output", help="Path to libc++ linker script",
                        required=True)
    parser.add_argument("libraries", nargs="+",
                        help="List of libraries libc++ depends on")
    args = parser.parse_args()

    # Use the relative path for the libc++ library.
    libcxx = os.path.relpath(args.input, os.path.dirname(args.output))

    # Prepare the list of public libraries to link.
    public_libs = ['-l%s' % l for l in args.libraries]

    # Generate the linker script contents.
    contents = "INPUT(%s)" % ' '.join([libcxx] + public_libs)

    if args.dryrun:
        print("GENERATING SCRIPT: '%s' as file %s" % (contents, args.output))
        return 0

    # Remove the existing libc++ symlink if it exists.
    if os.path.islink(args.output):
        os.unlink(args.output)

    # Replace it with the linker script.
    with open(args.output, 'w') as f:
        f.write(contents + "\n")

    return 0


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