| Dmitriy Ivanov | 284b468 | 2015-10-28 15:14:13 -0700 | [diff] [blame] | 1 | #!/usr/bin/python | 
|  | 2 |  | 
|  | 3 | # This tool is used to generate the version scripts for libc and libm | 
|  | 4 | # for every architecture. | 
|  | 5 |  | 
|  | 6 | import atexit | 
|  | 7 | import os.path | 
|  | 8 | import shutil | 
|  | 9 | import tempfile | 
| Greg Hackmann | e5c872f | 2016-03-03 13:10:23 -0800 | [diff] [blame] | 10 | import sys | 
| Dmitriy Ivanov | 284b468 | 2015-10-28 15:14:13 -0700 | [diff] [blame] | 11 |  | 
|  | 12 |  | 
|  | 13 | all_arches = ["arm", "arm64", "mips", "mips64", "x86", "x86_64"] | 
|  | 14 | bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc") | 
|  | 15 | bionic_libm_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libm") | 
| Dmitriy Ivanov | bc75047 | 2015-10-30 17:43:27 -0700 | [diff] [blame] | 16 | bionic_libdl_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libdl") | 
| Dmitriy Ivanov | 284b468 | 2015-10-28 15:14:13 -0700 | [diff] [blame] | 17 | libc_script = os.path.join(bionic_libc_root, "libc.map.txt") | 
|  | 18 | libm_script = os.path.join(bionic_libm_root, "libm.map.txt") | 
| Dmitriy Ivanov | bc75047 | 2015-10-30 17:43:27 -0700 | [diff] [blame] | 19 | libdl_script = os.path.join(bionic_libdl_root, "libdl.map.txt") | 
| Dimitry Ivanov | 6cc8d47 | 2016-07-28 13:52:17 -0700 | [diff] [blame] | 20 | libstdcxx_script = os.path.join(bionic_libc_root, "libstdc++.map.txt") | 
| Dmitriy Ivanov | 284b468 | 2015-10-28 15:14:13 -0700 | [diff] [blame] | 21 |  | 
| Greg Hackmann | e5c872f | 2016-03-03 13:10:23 -0800 | [diff] [blame] | 22 | script_name = os.path.basename(sys.argv[0]) | 
|  | 23 |  | 
| Dmitriy Ivanov | 284b468 | 2015-10-28 15:14:13 -0700 | [diff] [blame] | 24 | # TODO (dimity): generate architecture-specific version scripts as part of build | 
|  | 25 |  | 
|  | 26 | # temp directory where we store all intermediate files | 
|  | 27 | bionic_temp = tempfile.mkdtemp(prefix="bionic_genversionscripts") | 
|  | 28 | # Make sure the directory is deleted when the script exits. | 
|  | 29 | atexit.register(shutil.rmtree, bionic_temp) | 
|  | 30 |  | 
|  | 31 | bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc") | 
|  | 32 |  | 
| Greg Hackmann | e5c872f | 2016-03-03 13:10:23 -0800 | [diff] [blame] | 33 | warning = "Generated by %s. Do not edit." % script_name | 
| Dmitriy Ivanov | 284b468 | 2015-10-28 15:14:13 -0700 | [diff] [blame] | 34 |  | 
|  | 35 |  | 
| Dan Albert | ea701b3 | 2016-08-02 15:19:26 -0700 | [diff] [blame] | 36 | def has_arch_tags(tags): | 
|  | 37 | for arch in all_arches: | 
|  | 38 | if arch in tags: | 
|  | 39 | return True | 
| Dan Albert | ea701b3 | 2016-08-02 15:19:26 -0700 | [diff] [blame] | 40 | return False | 
|  | 41 |  | 
|  | 42 |  | 
| Dmitriy Ivanov | 284b468 | 2015-10-28 15:14:13 -0700 | [diff] [blame] | 43 | class VersionScriptGenerator(object): | 
|  | 44 |  | 
|  | 45 | def run(self): | 
| Dimitry Ivanov | 6cc8d47 | 2016-07-28 13:52:17 -0700 | [diff] [blame] | 46 | for script in [libc_script, libstdcxx_script, libm_script, libdl_script]: | 
| Dmitriy Ivanov | 284b468 | 2015-10-28 15:14:13 -0700 | [diff] [blame] | 47 | basename = os.path.basename(script) | 
|  | 48 | dirname = os.path.dirname(script) | 
|  | 49 | for arch in all_arches: | 
| Elliott Hughes | 5ffed9b | 2016-08-10 14:06:14 -0700 | [diff] [blame] | 50 | name = basename.split(".")[0] + "." + arch + ".map" | 
|  | 51 | tmp_path = os.path.join(bionic_temp, name) | 
|  | 52 | dest_path = os.path.join(dirname, name) | 
|  | 53 | with open(tmp_path, "w") as fout: | 
|  | 54 | with open(script, "r") as fin: | 
|  | 55 | fout.write("# %s\n" % warning) | 
|  | 56 | for line in fin: | 
|  | 57 | index = line.find("#") | 
|  | 58 | if index != -1: | 
|  | 59 | tags = line[index+1:].split() | 
|  | 60 | if arch not in tags and has_arch_tags(tags): | 
|  | 61 | continue | 
|  | 62 | fout.write(line) | 
|  | 63 | shutil.copyfile(tmp_path, dest_path) | 
| Dmitriy Ivanov | 284b468 | 2015-10-28 15:14:13 -0700 | [diff] [blame] | 64 |  | 
|  | 65 |  | 
|  | 66 | generator = VersionScriptGenerator() | 
|  | 67 | generator.run() |