| #!/usr/bin/env python | 
 |  | 
 | # This tool is used to generate the version scripts for libc and libm | 
 | # for every architecture. | 
 |  | 
 | import atexit | 
 | import os.path | 
 | import shutil | 
 | import tempfile | 
 | import sys | 
 |  | 
 |  | 
 | all_arches = ["arm", "arm64", "mips", "mips64", "x86", "x86_64"] | 
 | bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc") | 
 | bionic_libm_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libm") | 
 | bionic_libdl_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libdl") | 
 | libc_script = os.path.join(bionic_libc_root, "libc.map.txt") | 
 | libm_script = os.path.join(bionic_libm_root, "libm.map.txt") | 
 | libdl_script = os.path.join(bionic_libdl_root, "libdl.map.txt") | 
 | libstdcxx_script = os.path.join(bionic_libc_root, "libstdc++.map.txt") | 
 |  | 
 | script_name = os.path.basename(sys.argv[0]) | 
 |  | 
 | # TODO (dimity): generate architecture-specific version scripts as part of build | 
 |  | 
 | # temp directory where we store all intermediate files | 
 | bionic_temp = tempfile.mkdtemp(prefix="bionic_genversionscripts") | 
 | # Make sure the directory is deleted when the script exits. | 
 | atexit.register(shutil.rmtree, bionic_temp) | 
 |  | 
 | bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc") | 
 |  | 
 | warning = "Generated by %s. Do not edit." % script_name | 
 |  | 
 |  | 
 | def has_arch_tags(tags): | 
 |   for arch in all_arches: | 
 |     if arch in tags: | 
 |       return True | 
 |   return False | 
 |  | 
 |  | 
 | class VersionScriptGenerator(object): | 
 |  | 
 |   def run(self): | 
 |     for script in [libc_script, libstdcxx_script, libm_script, libdl_script]: | 
 |       basename = os.path.basename(script) | 
 |       dirname = os.path.dirname(script) | 
 |       for arch in all_arches: | 
 |         name = basename.split(".")[0] + "." + arch + ".map" | 
 |         tmp_path = os.path.join(bionic_temp, name) | 
 |         dest_path = os.path.join(dirname, name) | 
 |         with open(tmp_path, "w") as fout: | 
 |           with open(script, "r") as fin: | 
 |             fout.write("# %s\n" % warning) | 
 |             for line in fin: | 
 |               index = line.find("#") | 
 |               if index != -1: | 
 |                 tags = line[index+1:].split() | 
 |                 if arch not in tags and has_arch_tags(tags): | 
 |                   continue | 
 |               fout.write(line) | 
 |         shutil.copyfile(tmp_path, dest_path) | 
 |  | 
 |  | 
 | generator = VersionScriptGenerator() | 
 | generator.run() |