blob: e15c04e5f7e2ceb4942e4a504f9b44e092a93102 [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
10
11
12all_arches = ["arm", "arm64", "mips", "mips64", "x86", "x86_64"]
13bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc")
14bionic_libm_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libm")
Dmitriy Ivanovbc750472015-10-30 17:43:27 -070015bionic_libdl_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libdl")
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070016libc_script = os.path.join(bionic_libc_root, "libc.map.txt")
17libm_script = os.path.join(bionic_libm_root, "libm.map.txt")
Dmitriy Ivanovbc750472015-10-30 17:43:27 -070018libdl_script = os.path.join(bionic_libdl_root, "libdl.map.txt")
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070019
20# TODO (dimity): generate architecture-specific version scripts as part of build
21
22# temp directory where we store all intermediate files
23bionic_temp = tempfile.mkdtemp(prefix="bionic_genversionscripts")
24# Make sure the directory is deleted when the script exits.
25atexit.register(shutil.rmtree, bionic_temp)
26
27bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc")
28
29warning = "Generated by genversionscripts.py. Do not edit."
30
31
32class VersionScriptGenerator(object):
33
34 def run(self):
Dmitriy Ivanovbc750472015-10-30 17:43:27 -070035 for script in [libc_script, libm_script, libdl_script]:
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070036 basename = os.path.basename(script)
37 dirname = os.path.dirname(script)
38 for arch in all_arches:
Dimitry Ivanov585e9592015-12-14 14:07:52 -080039 for brillo in [False, True]:
40 has_nobrillo = False
41 name = basename.split(".")[0] + "." + arch + (".brillo" if brillo else "") + ".map"
42 tmp_path = os.path.join(bionic_temp, name)
43 dest_path = os.path.join(dirname, name)
44 with open(tmp_path, "w") as fout:
45 with open(script, "r") as fin:
46 fout.write("# %s\n" % warning)
47 for line in fin:
48 index = line.find("#")
49 if index != -1:
50 tags = line[index+1:].split()
51 if arch not in tags:
52 continue
53 if brillo and "nobrillo" in tags:
54 has_nobrillo = True
55 continue
56 fout.write(line)
57 if not brillo or has_nobrillo:
58 shutil.copyfile(tmp_path, dest_path)
Dmitriy Ivanov284b4682015-10-28 15:14:13 -070059
60
61generator = VersionScriptGenerator()
62generator.run()
63