From b01e7f7fd6c3fe164c0d84c309cae22039f71cba Mon Sep 17 00:00:00 2001 From: Dan Willemsen Date: Mon, 3 Apr 2017 14:28:36 -0700 Subject: [PATCH] Support a `vndk` tag in gen_stub_libs.py This hides a particular symbol from the NDK stubs, while allowing the symbol to be exposed to the VNDK through the LLNDK stubs. This doesn't introduce any sort of versioning yet, this will need to change when we add a new symbol to a new version of the VNDK. Test: test_gen_stub_libs.py Test: With my LL-NDK patches, inspecting the generated map files Change-Id: Iee86aafda7985d6d7a016d0d5ff951505634913b --- cc/gen_stub_libs.py | 16 +++++++++---- cc/test_gen_stub_libs.py | 50 ++++++++++++++++++++++++++++------------ 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/cc/gen_stub_libs.py b/cc/gen_stub_libs.py index d6cd973ef..7c704068e 100755 --- a/cc/gen_stub_libs.py +++ b/cc/gen_stub_libs.py @@ -79,7 +79,7 @@ def version_is_private(version): return version.endswith('_PRIVATE') or version.endswith('_PLATFORM') -def should_omit_version(name, tags, arch, api): +def should_omit_version(name, tags, arch, api, vndk): """Returns True if the version section should be ommitted. We want to omit any sections that do not have any symbols we'll have in the @@ -90,6 +90,8 @@ def should_omit_version(name, tags, arch, api): return True if 'platform-only' in tags: return True + if 'vndk' in tags and not vndk: + return True if not symbol_in_arch(tags, arch): return True if not symbol_in_api(tags, arch, api): @@ -271,11 +273,12 @@ class SymbolFileParser(object): class Generator(object): """Output generator that writes stub source files and version scripts.""" - def __init__(self, src_file, version_script, arch, api): + def __init__(self, src_file, version_script, arch, api, vndk): self.src_file = src_file self.version_script = version_script self.arch = arch self.api = api + self.vndk = vndk def write(self, versions): """Writes all symbol data to the output files.""" @@ -286,13 +289,15 @@ class Generator(object): """Writes a single version block's data to the output files.""" name = version.name tags = version.tags - if should_omit_version(name, tags, self.arch, self.api): + if should_omit_version(name, tags, self.arch, self.api, self.vndk): return section_versioned = symbol_versioned_in_api(tags, self.api) version_empty = True pruned_symbols = [] for symbol in version.symbols: + if not self.vndk and 'vndk' in symbol.tags: + continue if not symbol_in_arch(symbol.tags, self.arch): continue if not symbol_in_api(symbol.tags, self.arch, self.api): @@ -333,6 +338,8 @@ def parse_args(): parser.add_argument( '--arch', choices=ALL_ARCHITECTURES, required=True, help='Architecture being targeted.') + parser.add_argument( + '--vndk', action='store_true', help='Use the VNDK variant.') parser.add_argument( 'symbol_file', type=os.path.realpath, help='Path to symbol file.') @@ -361,7 +368,8 @@ def main(): with open(args.stub_src, 'w') as src_file: with open(args.version_script, 'w') as version_file: - generator = Generator(src_file, version_file, args.arch, args.api) + generator = Generator(src_file, version_file, args.arch, args.api, + args.vndk) generator.write(versions) diff --git a/cc/test_gen_stub_libs.py b/cc/test_gen_stub_libs.py index 8683d318a..8611ef3c3 100755 --- a/cc/test_gen_stub_libs.py +++ b/cc/test_gen_stub_libs.py @@ -107,27 +107,39 @@ class SymbolPresenceTest(unittest.TestCase): class OmitVersionTest(unittest.TestCase): def test_omit_private(self): - self.assertFalse(gsl.should_omit_version('foo', [], 'arm', 9)) - - self.assertTrue(gsl.should_omit_version('foo_PRIVATE', [], 'arm', 9)) - self.assertTrue(gsl.should_omit_version('foo_PLATFORM', [], 'arm', 9)) + self.assertFalse(gsl.should_omit_version('foo', [], 'arm', 9, False)) self.assertTrue(gsl.should_omit_version( - 'foo', ['platform-only'], 'arm', 9)) + 'foo_PRIVATE', [], 'arm', 9, False)) + self.assertTrue(gsl.should_omit_version( + 'foo_PLATFORM', [], 'arm', 9, False)) + + self.assertTrue(gsl.should_omit_version( + 'foo', ['platform-only'], 'arm', 9, False)) + + def test_omit_vndk(self): + self.assertTrue(gsl.should_omit_version( + 'foo', ['vndk'], 'arm', 9, False)) + + self.assertFalse(gsl.should_omit_version('foo', [], 'arm', 9, True)) + self.assertFalse(gsl.should_omit_version( + 'foo', ['vndk'], 'arm', 9, True)) def test_omit_arch(self): - self.assertFalse(gsl.should_omit_version('foo', [], 'arm', 9)) - self.assertFalse(gsl.should_omit_version('foo', ['arm'], 'arm', 9)) + self.assertFalse(gsl.should_omit_version('foo', [], 'arm', 9, False)) + self.assertFalse(gsl.should_omit_version( + 'foo', ['arm'], 'arm', 9, False)) - self.assertTrue(gsl.should_omit_version('foo', ['x86'], 'arm', 9)) + self.assertTrue(gsl.should_omit_version( + 'foo', ['x86'], 'arm', 9, False)) def test_omit_api(self): - self.assertFalse(gsl.should_omit_version('foo', [], 'arm', 9)) + self.assertFalse(gsl.should_omit_version('foo', [], 'arm', 9, False)) self.assertFalse( - gsl.should_omit_version('foo', ['introduced=9'], 'arm', 9)) + gsl.should_omit_version('foo', ['introduced=9'], 'arm', 9, False)) self.assertTrue( - gsl.should_omit_version('foo', ['introduced=14'], 'arm', 9)) + gsl.should_omit_version('foo', ['introduced=14'], 'arm', 9, False)) class SymbolFileParseTest(unittest.TestCase): @@ -302,7 +314,7 @@ class GeneratorTest(unittest.TestCase): # OmitVersionTest, PrivateVersionTest, and SymbolPresenceTest. src_file = cStringIO.StringIO() version_file = cStringIO.StringIO() - generator = gsl.Generator(src_file, version_file, 'arm', 9) + generator = gsl.Generator(src_file, version_file, 'arm', 9, False) version = gsl.Version('VERSION_PRIVATE', None, [], [ gsl.Symbol('foo', []), @@ -330,7 +342,7 @@ class GeneratorTest(unittest.TestCase): # SymbolPresenceTest. src_file = cStringIO.StringIO() version_file = cStringIO.StringIO() - generator = gsl.Generator(src_file, version_file, 'arm', 9) + generator = gsl.Generator(src_file, version_file, 'arm', 9, False) version = gsl.Version('VERSION_1', None, [], [ gsl.Symbol('foo', ['x86']), @@ -346,10 +358,17 @@ class GeneratorTest(unittest.TestCase): self.assertEqual('', src_file.getvalue()) self.assertEqual('', version_file.getvalue()) + version = gsl.Version('VERSION_1', None, [], [ + gsl.Symbol('foo', ['vndk']), + ]) + generator.write_version(version) + self.assertEqual('', src_file.getvalue()) + self.assertEqual('', version_file.getvalue()) + def test_write(self): src_file = cStringIO.StringIO() version_file = cStringIO.StringIO() - generator = gsl.Generator(src_file, version_file, 'arm', 9) + generator = gsl.Generator(src_file, version_file, 'arm', 9, False) versions = [ gsl.Version('VERSION_1', None, [], [ @@ -410,6 +429,7 @@ class IntegrationTest(unittest.TestCase): VERSION_4 { # versioned=9 wibble; + wizzes; # vndk } VERSION_2; VERSION_5 { # versioned=14 @@ -421,7 +441,7 @@ class IntegrationTest(unittest.TestCase): src_file = cStringIO.StringIO() version_file = cStringIO.StringIO() - generator = gsl.Generator(src_file, version_file, 'arm', 9) + generator = gsl.Generator(src_file, version_file, 'arm', 9, False) generator.write(versions) expected_src = textwrap.dedent("""\