#!/usr/bin/env python
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

### generates documentation for a Rust target

import argparse
import os
import platform
import subprocess
import sys

import lib.rust
from lib.rust import ROOT_PATH

def manifest_path_from_path_or_gn_target(arg):
    if arg.endswith("Cargo.toml"):
        return os.path.abspath(arg)
    else:
        gn_target = lib.rust.GnTarget(arg)
        return gn_target.manifest_path(lib.rust.find_out_dir())

def main():
    parser = argparse.ArgumentParser("Compiles all third-party Rust crates")
    parser.add_argument("manifest_path",
                        metavar="gn_target",
                        type=manifest_path_from_path_or_gn_target,
                        help="GN target to document. \
                              Use '.[:target]' to discover the cargo target \
                              for the current directory or use the \
                              absolute path to the target \
                              (relative to $FUCHSIA_DIR). \
                              For example: //garnet/bin/foo/bar:baz. \
                              Alternatively, this can be a path to a \
                              Cargo.toml file of a package for which to \
                              generate docs.")
    parser.add_argument("--target",
                        help="Target triple for which this crate is being compiled",
                        default="x86_64-fuchsia")
    parser.add_argument("--out-dir",
                        help="Path to the Fuchsia output directory",
                        required=False)
    parser.add_argument("--no-deps",
                        action="store_true",
                        help="Disable building of docs for dependencies")
    parser.add_argument("--doc-private",
                        action="store_true",
                        help="Document private items")
    parser.add_argument("--open",
                        action="store_true",
                        help="Open the generated documentation")

    args = parser.parse_args()

    if args.out_dir:
        out_dir = args.out_dir
    else:
        out_dir = lib.rust.find_out_dir()

    env = os.environ.copy()

    host_platform = "%s-%s" % (
        platform.system().lower().replace("darwin", "mac"),
        {
            "x86_64": "x64",
            "aarch64": "arm64",
        }[platform.machine()],
    )

    target_cpu = {
        "x86_64-fuchsia": "x64",
        "aarch64-fuchsia": "aarch64",
        "x86_64-unknown-linux-gnu": "x64",
        "aarch64-unknown-linux-gnu": "aarch64",
    }[args.target]

    # run cargo from third_party/rust-crtaes/rustc_deps which has an appropriate .cargo/config
    cwd = os.path.join(ROOT_PATH, "third_party", "rust-crates", "rustc_deps")
    buildtools_dir = os.path.join(ROOT_PATH, "buildtools", host_platform)
    clang_prefix = os.path.join(buildtools_dir, "clang", "bin")
    cmake_dir = os.path.join(buildtools_dir, "cmake", "bin")
    cargo = os.path.join(buildtools_dir, "rust", "bin", "cargo")
    rustc = os.path.join(buildtools_dir, "rust", "bin", "rustc")
    rustdoc = os.path.join(ROOT_PATH, "scripts", "rust", "rustdoc_no_ld_library_path.sh")

    shared_libs_root = os.path.join(ROOT_PATH, out_dir)
    sysroot = os.path.join(ROOT_PATH, out_dir, "sdk", "exported", "zircon_sysroot", \
            "arch", target_cpu, "sysroot")

    clang_c_compiler = os.path.join(clang_prefix, "clang")

    env["CARGO_TARGET_LINKER"] = clang_c_compiler
    env["CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER"] = clang_c_compiler
    env["CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER"] = clang_c_compiler
    env["CARGO_TARGET_%s_LINKER" % args.target.replace("-", "_").upper()] = clang_c_compiler
    if "fuchsia" in args.target:
        env["CARGO_TARGET_%s_RUSTFLAGS" % args.target.replace("-", "_").upper()] = (
            "-Clink-arg=--target=" + args.target +
            " -Clink-arg=--sysroot=" + sysroot +
            " -Lnative=" + shared_libs_root
        )
    else:
        env["CARGO_TARGET_%s_RUSTFLAGS" % args.target.replace("-", "_").upper()] = (
            "-Clink-arg=--target=" + args.target
        )
    env["RUSTC"] = rustc
    env["RUSTDOC"] = rustdoc
    env["RUST_BACKTRACE"] = "1"
    env["CC"] = clang_c_compiler
    if "fuchsia" in args.target:
        env["CFLAGS"] = "--sysroot=%s -L %s" % (sysroot, shared_libs_root)
    env["CXX"] = os.path.join(clang_prefix, "clang++")
    env["AR"] = os.path.join(clang_prefix, "llvm-ar")
    env["RANLIB"] = os.path.join(clang_prefix, "llvm-ranlib")
    env["PATH"] = "%s:%s" % (env["PATH"], cmake_dir)

    call_args = [
        cargo,
        "doc",
        "--manifest-path=%s" % args.manifest_path,
        "--target=%s" % args.target,
    ]

    if args.no_deps:
        call_args.append("--no-deps")

    if args.open:
        call_args.append("--open")

    if args.doc_private:
        call_args.append("--document-private-items")

    return subprocess.call(call_args, env=env, cwd=cwd)

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