blob: 343a793d3ab15797030b23a48b613588568c0d60 [file] [log] [blame]
# Copyright 2021 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.
"""A script for updating BUILD.gn file for third-party golibs.
This script traverses source directories for all targets and prints updated
BUILD.gn to stdout.
TODO(https://github.com/golang/go/issues/42504): Switch to use `go list` when it
supports listing without build constraints.
"""
import argparse
import glob
import os
import sys
def is_source(f):
"""Returns true iff the input file name is considered a source file."""
return not f.endswith('_test.go') and (
f.endswith('.go') or f.endswith('.s'))
def all_sources(golibs_dir, lib_name):
"""Returns all source paths to all source files of a library.
Paths are relative to library root: vendor/{lib_name}
"""
lib_root = os.path.join(golibs_dir, 'vendor', lib_name)
return (
os.path.relpath(f, lib_root)
for f in glob.glob(os.path.join(lib_root, '**', '*'), recursive=True)
if is_source(f)
)
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
'--build-file',
help='The BUILD.gn file to update',
type=argparse.FileType('r'),
required=True,
)
parser.add_argument(
'--golibs-dir',
help='Root directory for third-party golibs',
required=True,
)
args = parser.parse_args()
lib_name = ''
skip = False
for line in args.build_file:
stripped_line = line.strip()
if stripped_line.startswith('go_library("'):
lib_name = line.split('"')[1]
print(line.rstrip())
continue
if skip:
if stripped_line.endswith(']'):
skip = False
continue
# Skip old sources because we'll rewrite the list with updated ones.
if stripped_line.startswith('sources = ['):
# There's only one source.
if stripped_line.endswith(']'):
continue
skip = True
continue
# Add sources right before the target ends.
if stripped_line == '}':
sources = all_sources(args.golibs_dir, lib_name)
print(' sources = [')
print('\n'.join(f' "{src}",' for src in sorted(sources)))
print(' ]')
# Leave all other lines untouched.
print(line.rstrip())
if __name__ == '__main__':
sys.exit(main())