Merge "Auto generate prebuilt libs for vndk snapshot v28" am: 3c909d817e
Original change: https://android-review.googlesource.com/c/platform/development/+/1512664 Change-Id: Ie9ceec03277b5ac945f01d4b5bbdcd7ab0101fa5
This commit is contained in:
@@ -67,6 +67,27 @@ class GenBuildFile(object):
|
|||||||
'vndkproduct.libraries.txt',
|
'vndkproduct.libraries.txt',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
"""Some vendor prebuilts reference libprotobuf-cpp-lite.so and
|
||||||
|
libprotobuf-cpp-full.so and expect the 3.0.0-beta3 version.
|
||||||
|
The new version of protobuf will be installed as
|
||||||
|
/vendor/lib64/libprotobuf-cpp-lite-3.9.1.so. The VNDK doesn't
|
||||||
|
help here because we compile old devices against the current
|
||||||
|
branch and not an old VNDK snapshot. We need to continue to
|
||||||
|
provide a vendor libprotobuf-cpp-lite.so until all products in
|
||||||
|
the current branch get updated prebuilts or are obsoleted.
|
||||||
|
|
||||||
|
VENDOR_COMPAT is a dictionary that has VNDK versions as keys and
|
||||||
|
the list of (library name string, shared libs list) as values.
|
||||||
|
"""
|
||||||
|
VENDOR_COMPAT = {
|
||||||
|
28: [
|
||||||
|
('libprotobuf-cpp-lite',
|
||||||
|
['libc++', 'libc', 'libdl', 'liblog', 'libm', 'libz']),
|
||||||
|
('libprotobuf-cpp-full',
|
||||||
|
['libc++', 'libc', 'libdl', 'liblog', 'libm', 'libz']),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
def __init__(self, install_dir, vndk_version):
|
def __init__(self, install_dir, vndk_version):
|
||||||
"""GenBuildFile constructor.
|
"""GenBuildFile constructor.
|
||||||
|
|
||||||
@@ -136,14 +157,21 @@ class GenBuildFile(object):
|
|||||||
|
|
||||||
logging.info('Generating Android.bp for snapshot v{}'.format(
|
logging.info('Generating Android.bp for snapshot v{}'.format(
|
||||||
self._vndk_version))
|
self._vndk_version))
|
||||||
etc_buildrules = []
|
prebuilt_buildrules = []
|
||||||
for prebuilt in self.ETC_MODULES:
|
for prebuilt in self.ETC_MODULES:
|
||||||
etc_buildrules.append(self._gen_etc_prebuilt(prebuilt))
|
prebuilt_buildrules.append(self._gen_etc_prebuilt(prebuilt))
|
||||||
|
|
||||||
|
if self._vndk_version in self.VENDOR_COMPAT:
|
||||||
|
prebuilt_buildrules.append('// Defining prebuilt libraries '
|
||||||
|
'for the compatibility of old vendor modules')
|
||||||
|
for vendor_compat_lib_info in self.VENDOR_COMPAT[self._vndk_version]:
|
||||||
|
prebuilt_buildrules.append(
|
||||||
|
self._gen_prebuilt_library_shared(vendor_compat_lib_info))
|
||||||
|
|
||||||
with open(self._root_bpfile, 'w') as bpfile:
|
with open(self._root_bpfile, 'w') as bpfile:
|
||||||
bpfile.write(self._gen_autogen_msg('/'))
|
bpfile.write(self._gen_autogen_msg('/'))
|
||||||
bpfile.write('\n')
|
bpfile.write('\n')
|
||||||
bpfile.write('\n'.join(etc_buildrules))
|
bpfile.write('\n'.join(prebuilt_buildrules))
|
||||||
bpfile.write('\n')
|
bpfile.write('\n')
|
||||||
|
|
||||||
logging.info('Successfully generated {}'.format(self._root_bpfile))
|
logging.info('Successfully generated {}'.format(self._root_bpfile))
|
||||||
@@ -304,6 +332,56 @@ class GenBuildFile(object):
|
|||||||
'}}\n'.format(ind=self.INDENT))
|
'}}\n'.format(ind=self.INDENT))
|
||||||
return prebuilt_etc
|
return prebuilt_etc
|
||||||
|
|
||||||
|
def _gen_prebuilt_library_shared(self, prebuilt_lib_info):
|
||||||
|
"""Generates cc_prebuilt_library_shared modules for the old vendor
|
||||||
|
compatibility.
|
||||||
|
|
||||||
|
Some vendor modules still require old version of libraries that is not
|
||||||
|
available from the current source tree. To provide the old copy of the
|
||||||
|
libraries, use the vndk snapshot.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
prebuilt_lib_info: pair of (string, list of strings), name of the
|
||||||
|
prebuilt library and the list of shared libs for it.
|
||||||
|
"""
|
||||||
|
lib_name = prebuilt_lib_info[0]
|
||||||
|
shared_libs = prebuilt_lib_info[1]
|
||||||
|
|
||||||
|
shared_libs_prop = ''
|
||||||
|
if shared_libs:
|
||||||
|
shared_libs_prop = ('{ind}shared_libs: [\n'.format(ind=self.INDENT))
|
||||||
|
for lib in shared_libs:
|
||||||
|
shared_libs_prop += ('{ind}{ind}"{lib}",\n'.format(
|
||||||
|
ind=self.INDENT, lib=lib))
|
||||||
|
shared_libs_prop += ('{ind}],\n'.format(ind=self.INDENT))
|
||||||
|
|
||||||
|
cc_prebuilt_libraries = ('cc_prebuilt_library_shared {{\n'
|
||||||
|
'{ind}name: "{name}-vendorcompat",\n'
|
||||||
|
'{ind}stem: "{name}",\n'
|
||||||
|
'{ind}vendor: true,\n'
|
||||||
|
'{ind}// These are already stripped, and '
|
||||||
|
'restripping them just issues diagnostics.\n'
|
||||||
|
'{ind}strip: {{\n'
|
||||||
|
'{ind}{ind}none: true,\n'
|
||||||
|
'{ind}}},\n'
|
||||||
|
'{shared_libs}'
|
||||||
|
'{ind}target: {{\n'.format(
|
||||||
|
ind=self.INDENT,
|
||||||
|
name=lib_name,
|
||||||
|
shared_libs=shared_libs_prop))
|
||||||
|
src_paths = utils.find(self._install_dir, [lib_name+'.so'])
|
||||||
|
for src in src_paths:
|
||||||
|
dirs = src.split(os.path.sep)
|
||||||
|
if len(dirs) < 3 or not dirs[1].startswith('arch-{}-'.format(dirs[0])):
|
||||||
|
continue
|
||||||
|
cc_prebuilt_libraries += ('{ind}{ind}android_{arch}: {{\n'
|
||||||
|
'{ind}{ind}{ind}srcs: ["{src}"],\n'
|
||||||
|
'{ind}{ind}}},\n'.format(
|
||||||
|
ind=self.INDENT, arch=dirs[0], src=src))
|
||||||
|
cc_prebuilt_libraries += ('{ind}}},\n'
|
||||||
|
'}}\n'.format(ind=self.INDENT))
|
||||||
|
return cc_prebuilt_libraries
|
||||||
|
|
||||||
def _gen_notice_filegroup(self, module):
|
def _gen_notice_filegroup(self, module):
|
||||||
"""Generates a notice filegroup build rule for a given module.
|
"""Generates a notice filegroup build rule for a given module.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user