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:
@@ -10,7 +10,7 @@ from utils import (
|
|||||||
AOSP_DIR, COMPRESSED_SOURCE_ABI_DUMP_EXT, SOURCE_ABI_DUMP_EXT,
|
AOSP_DIR, COMPRESSED_SOURCE_ABI_DUMP_EXT, SOURCE_ABI_DUMP_EXT,
|
||||||
SOURCE_ABI_DUMP_EXT_END, SO_EXT, copy_reference_dumps, find_lib_lsdumps,
|
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,
|
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',
|
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]
|
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):
|
def get_lib_arch_str(target):
|
||||||
assert target.primary_arch != ''
|
assert target.primary_arch != ''
|
||||||
target_arch_variant_str = ''
|
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
|
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)
|
print('making libs for', product + '-' + variant)
|
||||||
if libs:
|
if libs:
|
||||||
make_libraries(libs, product, variant, llndk_mode)
|
make_libraries(product, variant, targets, libs, llndk_mode)
|
||||||
else:
|
else:
|
||||||
make_tree(product, variant)
|
make_tree(product, variant)
|
||||||
|
|
||||||
@@ -163,14 +143,6 @@ def add_to_path_dict(path, dictionary, libs=tuple()):
|
|||||||
dictionary[libname].append(path)
|
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,
|
def create_source_abi_reference_dumps(args, product,
|
||||||
chosen_vndk_version, lsdump_paths,
|
chosen_vndk_version, lsdump_paths,
|
||||||
targets):
|
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
|
# Build all the specified libs (or build the 'vndk' target if none
|
||||||
# of them are specified.)
|
# of them are specified.)
|
||||||
make_libs_for_product(args.libs, args.llndk, product,
|
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(
|
num_processed += create_source_abi_reference_dumps(
|
||||||
args, product, chosen_vndk_version, lsdump_paths, targets)
|
args, product, chosen_vndk_version, lsdump_paths, targets)
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import os
|
|||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
import collections
|
||||||
|
|
||||||
|
|
||||||
SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
|
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)
|
return read_output_content(output_path, AOSP_DIR)
|
||||||
|
|
||||||
|
|
||||||
def make_tree(product, variant):
|
def make_targets(product, variant, targets):
|
||||||
# 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):
|
|
||||||
make_cmd = ['build/soong/soong_ui.bash', '--make-mode', '-j',
|
make_cmd = ['build/soong/soong_ui.bash', '--make-mode', '-j',
|
||||||
'TARGET_PRODUCT=' + product, 'TARGET_BUILD_VARIANT=' + variant]
|
'TARGET_PRODUCT=' + product, 'TARGET_BUILD_VARIANT=' + variant]
|
||||||
make_cmd += targets
|
make_cmd += targets
|
||||||
subprocess.check_call(make_cmd, cwd=AOSP_DIR, stdout=subprocess.DEVNULL,
|
subprocess.check_call(make_cmd, cwd=AOSP_DIR)
|
||||||
stderr=subprocess.STDOUT)
|
|
||||||
|
|
||||||
|
|
||||||
def make_libraries(libs, product, variant, llndk_mode):
|
def make_tree(product, variant):
|
||||||
# To aid creation of reference dumps. Makes lib.vendor for the current
|
"""Build all lsdump files."""
|
||||||
# configuration.
|
return make_targets(product, variant, ['findlsdumps'])
|
||||||
lib_targets = []
|
|
||||||
for lib in libs:
|
|
||||||
lib = lib if llndk_mode else lib + VENDOR_SUFFIX
|
def make_libraries(product, variant, targets, libs, llndk_mode):
|
||||||
lib_targets.append(lib)
|
"""Build lsdump files for specific libs."""
|
||||||
make_targets(lib_targets, product, variant)
|
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,
|
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
|
"""Find the lsdump corresponding to lib_name for the given module variant
|
||||||
if it exists."""
|
if it exists."""
|
||||||
result = []
|
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:
|
if libs and lib_name not in libs:
|
||||||
continue
|
continue
|
||||||
for path in paths:
|
for variation, path in variations.items():
|
||||||
if module_variant_dir_name in path.split(os.path.sep):
|
if variation.startswith(module_variant_dir_name):
|
||||||
result.append(os.path.join(AOSP_DIR, path.strip()))
|
result.append(os.path.join(AOSP_DIR, path.strip()))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user