Merge changes I56d4f852,I8c81dc1f

* changes:
  Find make goals from lsdump_paths.txt
  Always collect lsdump paths from lsdump_paths.txt
This commit is contained in:
Logan Chien
2019-03-05 10:48:06 +00:00
committed by Gerrit Code Review
2 changed files with 93 additions and 55 deletions

View File

@@ -10,7 +10,7 @@ from utils import (
AOSP_DIR, COMPRESSED_SOURCE_ABI_DUMP_EXT, SOURCE_ABI_DUMP_EXT,
SOURCE_ABI_DUMP_EXT_END, SO_EXT, copy_reference_dumps, find_lib_lsdumps,
get_build_vars_for_product, get_module_variant_dir_name, make_libraries,
make_tree)
make_tree, read_lsdump_paths)
PRODUCTS_DEFAULT = ['aosp_arm_ab', 'aosp_arm', 'aosp_arm64', 'aosp_x86_ab',
@@ -35,26 +35,6 @@ class Target(object):
self.cpu_variant = build_vars[3]
def get_lsdump_paths(product, libs):
if libs is None:
return get_lsdump_paths_from_out(product)
return search_for_lsdump_paths(SOONG_DIR, libs)
def get_lsdump_paths_from_out(product):
build_vars_to_fetch = ['OUT_DIR', 'TARGET_DEVICE']
build_vars = get_build_vars_for_product(build_vars_to_fetch, product)
lsdump_paths_file = os.path.join(
AOSP_DIR, build_vars[0], 'target', 'product', build_vars[1],
'lsdump_paths.txt')
assert os.path.exists(lsdump_paths_file)
lsdump_paths = collections.defaultdict(list)
with open(lsdump_paths_file) as f:
for path in f:
add_to_path_dict(path.rstrip(), lsdump_paths)
return lsdump_paths
def get_lib_arch_str(target):
assert target.primary_arch != ''
target_arch_variant_str = ''
@@ -103,10 +83,10 @@ def get_ref_dump_dir_stem(args, vndk_or_ndk, product, chosen_vndk_version):
return ref_dump_dir_stem
def make_libs_for_product(libs, llndk_mode, product, variant):
def make_libs_for_product(libs, llndk_mode, product, variant, targets):
print('making libs for', product + '-' + variant)
if libs:
make_libraries(libs, product, variant, llndk_mode)
make_libraries(product, variant, targets, libs, llndk_mode)
else:
make_tree(product, variant)
@@ -163,14 +143,6 @@ def add_to_path_dict(path, dictionary, libs=tuple()):
dictionary[libname].append(path)
def search_for_lsdump_paths(soong_dir, libs):
lsdump_paths = collections.defaultdict(list)
for root, _, files in os.walk(soong_dir):
for file in files:
add_to_path_dict(os.path.join(root, file), lsdump_paths, libs)
return lsdump_paths
def create_source_abi_reference_dumps(args, product,
chosen_vndk_version, lsdump_paths,
targets):
@@ -224,9 +196,11 @@ def create_source_abi_reference_dumps_for_all_products(args):
# Build all the specified libs (or build the 'vndk' target if none
# of them are specified.)
make_libs_for_product(args.libs, args.llndk, product,
args.build_variant)
args.build_variant, targets)
lsdump_paths = read_lsdump_paths(product, args.build_variant, targets,
build=False)
lsdump_paths = get_lsdump_paths(product, args.libs)
num_processed += create_source_abi_reference_dumps(
args, product, chosen_vndk_version, lsdump_paths, targets)

View File

@@ -5,6 +5,7 @@ import os
import subprocess
import sys
import tempfile
import collections
SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
@@ -138,30 +139,93 @@ def run_header_abi_linker(output_path, inputs, version_script, api, arch,
return read_output_content(output_path, AOSP_DIR)
def make_tree(product, variant):
# To aid creation of reference dumps.
make_cmd = ['build/soong/soong_ui.bash', '--make-mode', '-j',
'vndk', 'findlsdumps', 'TARGET_PRODUCT=' + product,
'TARGET_BUILD_VARIANT=' + variant]
subprocess.check_call(make_cmd, cwd=AOSP_DIR)
def make_targets(targets, product, variant):
def make_targets(product, variant, targets):
make_cmd = ['build/soong/soong_ui.bash', '--make-mode', '-j',
'TARGET_PRODUCT=' + product, 'TARGET_BUILD_VARIANT=' + variant]
make_cmd += targets
subprocess.check_call(make_cmd, cwd=AOSP_DIR, stdout=subprocess.DEVNULL,
stderr=subprocess.STDOUT)
subprocess.check_call(make_cmd, cwd=AOSP_DIR)
def make_libraries(libs, product, variant, llndk_mode):
# To aid creation of reference dumps. Makes lib.vendor for the current
# configuration.
lib_targets = []
for lib in libs:
lib = lib if llndk_mode else lib + VENDOR_SUFFIX
lib_targets.append(lib)
make_targets(lib_targets, product, variant)
def make_tree(product, variant):
"""Build all lsdump files."""
return make_targets(product, variant, ['findlsdumps'])
def make_libraries(product, variant, targets, libs, llndk_mode):
"""Build lsdump files for specific libs."""
lsdump_paths = read_lsdump_paths(product, variant, targets, build=True)
targets = []
for name in libs:
targets.extend(lsdump_paths[name].values())
make_targets(product, variant, targets)
def get_lsdump_paths_file_path(product, variant):
"""Get the path to lsdump_paths.txt."""
product_out = get_build_vars_for_product(
['PRODUCT_OUT'], product, variant)[0]
return os.path.join(product_out, 'lsdump_paths.txt')
def _is_sanitizer_variation(variation):
"""Check whether the variation is introduced by a sanitizer."""
return variation in {'asan', 'hwasan', 'tsan', 'intOverflow', 'cfi', 'scs'}
def _are_sanitizer_variations(variations):
"""Check whether these variations are introduced by sanitizers."""
if isinstance(variations, str):
variations = [v for v in variations.split('_') if v]
return all(_is_sanitizer_variation(v) for v in variations)
def _read_lsdump_paths(lsdump_paths_file_path, targets):
"""Read lsdump path from lsdump_paths.txt for each libname and variant."""
lsdump_paths = collections.defaultdict(dict)
suffixes = collections.defaultdict(dict)
prefixes = []
prefixes.extend(get_module_variant_dir_name(
target.arch, target.arch_variant, target.cpu_variant, '_core_shared')
for target in targets)
prefixes.extend(get_module_variant_dir_name(
target.arch, target.arch_variant, target.cpu_variant, '_vendor_shared')
for target in targets)
with open(lsdump_paths_file_path, 'r') as lsdump_paths_file:
for line in lsdump_paths_file:
path = line.strip()
if not path:
continue
dirname, filename = os.path.split(path)
if not filename.endswith(SOURCE_ABI_DUMP_EXT):
continue
libname = filename[:-len(SOURCE_ABI_DUMP_EXT)]
if not libname:
continue
variant = os.path.basename(dirname)
if not variant:
continue
for prefix in prefixes:
if not variant.startswith(prefix):
continue
new_suffix = variant[len(prefix):]
if not _are_sanitizer_variations(new_suffix):
continue
old_suffix = suffixes[libname].get(prefix)
if not old_suffix or new_suffix > old_suffix:
lsdump_paths[libname][prefix] = path
suffixes[libname][prefix] = new_suffix
return lsdump_paths
def read_lsdump_paths(product, variant, targets, build=True):
"""Build lsdump_paths.txt and read the paths."""
lsdump_paths_file_path = get_lsdump_paths_file_path(product, variant)
if build:
make_targets(product, variant, [lsdump_paths_file_path])
lsdump_paths_file_abspath = os.path.join(AOSP_DIR, lsdump_paths_file_path)
return _read_lsdump_paths(lsdump_paths_file_abspath, targets)
def get_module_variant_dir_name(arch, arch_variant, cpu_variant,
@@ -187,11 +251,11 @@ def find_lib_lsdumps(module_variant_dir_name, lsdump_paths, libs):
"""Find the lsdump corresponding to lib_name for the given module variant
if it exists."""
result = []
for lib_name, paths in lsdump_paths.items():
for lib_name, variations in lsdump_paths.items():
if libs and lib_name not in libs:
continue
for path in paths:
if module_variant_dir_name in path.split(os.path.sep):
for variation, path in variations.items():
if variation.startswith(module_variant_dir_name):
result.append(os.path.join(AOSP_DIR, path.strip()))
return result