| #!/usr/bin/env python3.8 |
| # |
| # 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 platform |
| 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", required=True) |
| 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) |
| with open(args.depfile, "w") as outfile: |
| outfile.write(depfile) |
| return 0 |
| |
| |
| if __name__ == "__main__": |
| sys.exit(main()) |