Home | History | Annotate | Download | only in tests
      1 #!/usr/bin/env python3
      2 
      3 import os
      4 
      5 from vndk_definition_tool import (ELF, ELFLinker, PT_SYSTEM, PT_VENDOR)
      6 
      7 
      8 class GraphBuilder(object):
      9     _PARTITION_NAMES = {
     10         PT_SYSTEM: 'system',
     11         PT_VENDOR: 'vendor',
     12     }
     13 
     14 
     15     _LIB_DIRS = {
     16         ELF.ELFCLASS32: 'lib',
     17         ELF.ELFCLASS64: 'lib64',
     18     }
     19 
     20 
     21     def __init__(self):
     22         self.graph = ELFLinker()
     23 
     24 
     25     def add_lib(self, partition, klass, name, dt_needed=tuple(),
     26                 exported_symbols=tuple(), imported_symbols=tuple(),
     27                 extra_dir=None):
     28         """Create and add a shared library to ELFLinker."""
     29 
     30         lib_dir = os.path.join('/', self._PARTITION_NAMES[partition],
     31                                self._LIB_DIRS[klass])
     32         if extra_dir:
     33             lib_dir = os.path.join(lib_dir, extra_dir)
     34 
     35         path = os.path.join(lib_dir, name + '.so')
     36 
     37         elf = ELF(klass, ELF.ELFDATA2LSB, dt_needed=dt_needed,
     38                   exported_symbols=set(exported_symbols),
     39                   imported_symbols=set(imported_symbols))
     40 
     41         lib = self.graph.add_lib(partition, path, elf)
     42         setattr(self, name + '_' + elf.elf_class_name, lib)
     43         return lib
     44 
     45 
     46     def add_lib32(self, partition, name, dt_needed=tuple(),
     47                   exported_symbols=tuple(), imported_symbols=tuple(),
     48                   extra_dir=None):
     49         return self.add_lib(partition, ELF.ELFCLASS32, name, dt_needed,
     50                             exported_symbols, imported_symbols, extra_dir)
     51 
     52 
     53     def add_lib64(self, partition, name, dt_needed=tuple(),
     54                   exported_symbols=tuple(), imported_symbols=tuple(),
     55                   extra_dir=None):
     56         return self.add_lib(partition, ELF.ELFCLASS64, name, dt_needed,
     57                             exported_symbols, imported_symbols, extra_dir)
     58 
     59 
     60     def add_multilib(self, partition, name, dt_needed=tuple(),
     61                      exported_symbols=tuple(), imported_symbols=tuple(),
     62                      extra_dir=None):
     63         """Add 32-bit / 64-bit shared libraries to ELFLinker."""
     64         return (
     65             self.add_lib(partition, ELF.ELFCLASS32, name, dt_needed,
     66                          exported_symbols, imported_symbols, extra_dir),
     67             self.add_lib(partition, ELF.ELFCLASS64, name, dt_needed,
     68                          exported_symbols, imported_symbols, extra_dir)
     69         )
     70 
     71 
     72     def resolve(self, vndk_lib_dirs=None, ro_vndk_version=None):
     73         if vndk_lib_dirs is not None:
     74             self.graph.vndk_lib_dirs = vndk_lib_dirs
     75         if ro_vndk_version is not None:
     76             self.graph.ro_vndk_version = ro_vndk_version
     77         self.graph.resolve_deps()
     78