blob: 784648360af4d464f7a1e93a466db0323ffe6cef [file] [log] [blame]
#!/usr/bin/env python3.8
# 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.
import argparse
import os
import re
import shutil
import sys
_targets_to_remove = [
"cts_copy_to_sdk",
"cts_source_library",
"sdk_molecule",
"cts_unstripped_binaries_file",
"action(\"fidl_mangled_to_api_mapping\")",
"link_output_rspfile",
]
def transform_build_gn(src, dest, in_tree_mappings, version):
"""
Naively transforms a BUILD.gn file to work in the CTS archive.
"""
with open(src, "r") as f:
lines = f.readlines()
output = []
count = 0
for line in lines:
# Naively match curly braces and exclude them from the output.
if any(target in line for target in _targets_to_remove) or count:
count = _find_brace(line, count)
# Replace dependency with CTS version.
elif any(key in line for key in in_tree_mappings.keys()):
for key in in_tree_mappings.keys():
if key in line:
output.append(line.replace(key, in_tree_mappings[key]))
elif version != "" and "package_name" in line:
# Append between the quotes of `package_name = "name"`
output.append(re.sub(r'\"(.+)\"', r'"\1_%s"' % version, line))
else:
output.append(line)
with open(dest, "w") as f:
f.writelines(output)
def _find_brace(line, count):
for ch in line:
if ch == '{':
count += 1
elif ch == '}':
count -= 1
return count
def main():
parser = argparse.ArgumentParser(
"Naively transform BUILD.gn files to work in the CTS archive.")
parser.add_argument(
"--source", required=True, help="Source path to BUILD.gn to update.")
parser.add_argument(
"--dest", required=True, help="Destination path of updated BUILD.gn.")
parser.add_argument(
"--cts_version", required=False, help="CTS version name.")
args = parser.parse_args()
if not os.path.isfile(args.source):
print("Source file: %s does not exist" % args.source)
return 1
if not os.path.isdir(args.dest.rsplit("/", 1)[0]):
print("Destination dir: %s does not exist" % args.dest)
return 1
version = ""
if args.cts_version:
version = args.cts_version
in_tree_mappings = {
"//zircon/system/ulib/fbl":
f"//prebuilt/cts/{version}/cts/pkg/fbl",
"//zircon/system/ulib/zxtest":
f"//prebuilt/cts/{version}/cts/pkg/zxtest",
}
ext = os.path.splitext(args.source)[1]
if ext == ".gn":
transform_build_gn(args.source, args.dest, in_tree_mappings, version)
else:
shutil.copy(args.source, args.dest)
return 0
if __name__ == '__main__':
sys.exit(main())