blob: c1dd7efb7c33c0a4a48fe92279e64a79d1f11b78 [file] [log] [blame] [edit]
#!/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 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())