#!/usr/bin/env fuchsia-vendored-python
#
# Copyright 2020 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.

import argparse
from os import path
import os
import subprocess
import sys


def extract_build_graph(gn_binary, out_dir):
    args = [
        gn_binary,
        "desc",
        out_dir,
        "//*",
        "--format=json",
        "--all-toolchains",
    ]
    return subprocess.check_output(args)


def generate_depfile(outpath, out_dir):
    reloutpath = path.relpath(outpath, out_dir)
    # Just lie and say we depend on build.ninja so we get re-run every gen.
    # Despite the lie, this is more or less correct since we want to observe
    # every build graph change.
    return "%s: build.ninja" % reloutpath


def write_if_changed(outpath, content):
    """
    Writes content to the file named outpath.

    If outpath already exists and contains content already, does nothing and
    does not bump the file modification time. This lets ninja skip downstream
    actions if we don't need to change anything.
    """
    try:
        with open(outpath, "rb") as f:
            existing_content = f.read()
        if content == existing_content:
            return
    except IOError:
        pass

    with open(outpath, "wb") as outfile:
        outfile.write(content)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--root_build_dir", default=".")
    parser.add_argument("--fuchsia_dir", required=True)
    parser.add_argument("--gn_binary", required=True)
    parser.add_argument("--output", required=True)
    parser.add_argument("--depfile", required=True)
    args = parser.parse_args()

    fake_project_json = extract_build_graph(args.gn_binary, args.root_build_dir)
    write_if_changed(args.output, fake_project_json)

    depfile = generate_depfile(args.output, args.root_build_dir)
    os.makedirs(os.path.dirname(args.depfile), exist_ok=True)
    with open(args.depfile, "w") as outfile:
        outfile.write(depfile)
    return 0


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