blob: 53f4db4d5f086c55a108dffb18331e7c20b21a1f [file] [log] [blame]
Dmitriy Ivanov284b4682015-10-28 15:14:13 -07001#!/usr/bin/python
2
3# This tool is used to generate the version scripts for libc and libm
4# for every architecture.
5
6import atexit
7import os.path
8import shutil
9import tempfile
Greg Hackmanne5c872f2016-03-03 13:10:23 -080010import sys
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070011
12
13all_arches = ["arm", "arm64", "mips", "mips64", "x86", "x86_64"]
14bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc")
15bionic_libm_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libm")
Dmitriy Ivanovbc750472015-10-30 17:43:27 -070016bionic_libdl_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libdl")
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070017libc_script = os.path.join(bionic_libc_root, "libc.map.txt")
18libm_script = os.path.join(bionic_libm_root, "libm.map.txt")
Dmitriy Ivanovbc750472015-10-30 17:43:27 -070019libdl_script = os.path.join(bionic_libdl_root, "libdl.map.txt")
Dimitry Ivanov6cc8d472016-07-28 13:52:17 -070020libstdcxx_script = os.path.join(bionic_libc_root, "libstdc++.map.txt")
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070021
Greg Hackmanne5c872f2016-03-03 13:10:23 -080022script_name = os.path.basename(sys.argv[0])
23
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070024# TODO (dimity): generate architecture-specific version scripts as part of build
25
26# temp directory where we store all intermediate files
27bionic_temp = tempfile.mkdtemp(prefix="bionic_genversionscripts")
28# Make sure the directory is deleted when the script exits.
29atexit.register(shutil.rmtree, bionic_temp)
30
31bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc")
32
Greg Hackmanne5c872f2016-03-03 13:10:23 -080033warning = "Generated by %s. Do not edit." % script_name
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070034
35
Dan Albertea701b32016-08-02 15:19:26 -070036def has_arch_tags(tags):
37 for arch in all_arches:
38 if arch in tags:
39 return True
40 if 'nobrillo' in tags:
41 return True
42 return False
43
44
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070045class VersionScriptGenerator(object):
46
47 def run(self):
Dimitry Ivanov6cc8d472016-07-28 13:52:17 -070048 for script in [libc_script, libstdcxx_script, libm_script, libdl_script]:
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070049 basename = os.path.basename(script)
50 dirname = os.path.dirname(script)
51 for arch in all_arches:
Dimitry Ivanov585e9592015-12-14 14:07:52 -080052 for brillo in [False, True]:
53 has_nobrillo = False
54 name = basename.split(".")[0] + "." + arch + (".brillo" if brillo else "") + ".map"
55 tmp_path = os.path.join(bionic_temp, name)
56 dest_path = os.path.join(dirname, name)
57 with open(tmp_path, "w") as fout:
58 with open(script, "r") as fin:
59 fout.write("# %s\n" % warning)
60 for line in fin:
61 index = line.find("#")
62 if index != -1:
63 tags = line[index+1:].split()
Dan Albertea701b32016-08-02 15:19:26 -070064 if arch not in tags and has_arch_tags(tags):
Dimitry Ivanov585e9592015-12-14 14:07:52 -080065 continue
66 if brillo and "nobrillo" in tags:
67 has_nobrillo = True
68 continue
69 fout.write(line)
70 if not brillo or has_nobrillo:
71 shutil.copyfile(tmp_path, dest_path)
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070072
73
74generator = VersionScriptGenerator()
75generator.run()
76