| #!/usr/bin/env python |
| # Copyright 2019 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 json |
| import os |
| import shutil |
| import sys |
| |
| SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
| FUCHSIA_ROOT = os.path.dirname( # $root |
| os.path.dirname( # build |
| SCRIPT_DIR)) # zircon |
| ZIRCON_PUBLIC = os.path.join(FUCHSIA_ROOT, 'zircon', 'public') |
| TEMPLATE_FILE = os.path.join(SCRIPT_DIR, 'template.gn') |
| |
| PUBLIC_DIRS = set([ |
| 'banjo', |
| 'fidl', |
| 'lib', |
| 'tool', |
| ]) |
| |
| |
| def main(): |
| with open(sys.argv[1]) as f: |
| legacy_dirs = json.load(f) |
| dirs = {} |
| for dir in legacy_dirs: |
| top_dir = os.path.dirname(dir) |
| dirs[top_dir] = dirs.get(top_dir, []) + [os.path.basename(dir)] |
| assert set(dirs.keys()) == PUBLIC_DIRS, ( |
| "%r from JSON should match %r" % (set(dirs.keys()), PUBLIC_DIRS)) |
| template_stat = os.lstat(TEMPLATE_FILE) |
| for top_dir, subdirs in dirs.iteritems(): |
| top_dir = os.path.join(ZIRCON_PUBLIC, top_dir) |
| subdirs = set(subdirs) |
| if not os.path.exists(top_dir): |
| os.mkdir(top_dir) |
| else: |
| # Go over the existing contents of the directory. |
| for existing in os.listdir(top_dir): |
| existing_dir = os.path.join(top_dir, existing) |
| build_file = os.path.join(existing_dir, 'BUILD.gn') |
| if os.path.isdir(existing_dir): |
| if existing in subdirs: |
| # An existing directory might already have the link. |
| # If the link doesn't exist or doesn't match, make it. |
| if not os.path.exists(build_file): |
| os.link(TEMPLATE_FILE, build_file) |
| elif not os.path.samestat(os.lstat(build_file), |
| template_stat): |
| os.remove(build_file) |
| os.link(TEMPLATE_FILE, build_file) |
| subdirs.remove(existing) |
| else: |
| # A stale directory that shouldn't exist any more. |
| shutil.rmtree(existing_dir) |
| else: |
| # A stray file in one of the controlled directories. |
| os.remove(existing_dir) |
| # Make and populate any directories that don't exist yet. |
| for subdir in subdirs: |
| subdir = os.path.join(top_dir, subdir) |
| os.mkdir(subdir) |
| os.link(TEMPLATE_FILE, os.path.join(subdir, 'BUILD.gn')) |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |