#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Build script that builds a binary from a bundle."""


import argparse
import os.path
import re
import subprocess
import sys


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--config",
        required=True,
        choices=["cros.hardened", "cros.nonhardened", "cros.host", "android"],
    )
    parser.add_argument(
        "--use_ccache", required=True, choices=["true", "false"]
    )
    parser.add_argument(
        "--version_suffix",
        help="A string appended to the computed version of the wrapper. This "
        "is appeneded directly without any delimiter.",
    )
    parser.add_argument(
        "--use_llvm_next", required=True, choices=["true", "false"]
    )
    parser.add_argument("--output_file", required=True, type=str)
    parser.add_argument(
        "--static",
        choices=["true", "false"],
        help="If true, produce a static wrapper. Autodetects a good value if "
        "unspecified.",
    )
    args = parser.parse_args()

    if args.static is None:
        args.static = "cros" not in args.config
    else:
        args.static = args.static == "true"

    return args


def calc_go_args(args, version, build_dir):
    # These seem unnecessary, and might lead to breakages with Go's ldflag
    # parsing. Don't allow them.
    if "'" in version:
        raise ValueError("`version` should not contain single quotes")

    ldFlags = [
        "-X",
        "main.ConfigName=" + args.config,
        "-X",
        "main.UseCCache=" + args.use_ccache,
        "-X",
        "main.UseLlvmNext=" + args.use_llvm_next,
        "-X",
        # Quote this, as `version` may have spaces in it.
        "'main.Version=" + version + "'",
    ]

    # If the wrapper is intended for ChromeOS, we need to use libc's exec.
    extra_args = []
    if not args.static:
        extra_args += ["-tags", "libc_exec"]

    if args.config == "android":
        # If android_llvm_next_flags.go DNE, we'll get an obscure "no
        # llvmNextFlags" build error; complaining here is clearer.
        if not os.path.exists(
            os.path.join(build_dir, "android_llvm_next_flags.go")
        ):
            sys.exit(
                "In order to build the Android wrapper, you must have a local "
                "android_llvm_next_flags.go file; please see "
                "cros_llvm_next_flags.go."
            )
        extra_args += ["-tags", "android_llvm_next_flags"]

    return [
        "go",
        "build",
        "-o",
        os.path.abspath(args.output_file),
        "-ldflags",
        " ".join(ldFlags),
    ] + extra_args


def read_version(build_dir):
    version_path = os.path.join(build_dir, "VERSION")
    if os.path.exists(version_path):
        with open(version_path, "r") as r:
            return r.read()

    last_commit_msg = subprocess.check_output(
        ["git", "-C", build_dir, "log", "-1", "--pretty=%B"], encoding="utf-8"
    )
    # Use last found change id to support reverts as well.
    change_ids = re.findall(r"Change-Id: (\w+)", last_commit_msg)
    if not change_ids:
        sys.exit("Couldn't find Change-Id in last commit message.")
    return change_ids[-1]


def main():
    args = parse_args()
    build_dir = os.path.dirname(__file__)
    version = read_version(build_dir)
    if args.version_suffix:
        version += args.version_suffix
    # Note: Go does not support using absolute package names.
    # So we run go inside the directory of the the build file.
    sys.exit(
        subprocess.call(calc_go_args(args, version, build_dir), cwd=build_dir)
    )


if __name__ == "__main__":
    main()
