| #!/usr/bin/env python |
| # |
| import sys, cpp, kernel, glob, os, re, getopt, clean_header, subprocess |
| from defaults import * |
| from utils import * |
| |
| def usage(): |
| print """\ |
| usage: %(progname)s [kernel-original-path] [kernel-modified-path] |
| |
| this program is used to update all the auto-generated clean headers |
| used by the Bionic C library. it assumes the following: |
| |
| - a set of source kernel headers is located in |
| 'external/kernel-headers/original', relative to the current |
| android tree |
| |
| - a set of manually modified kernel header files located in |
| 'external/kernel-headers/modified', relative to the current |
| android tree |
| |
| - the clean headers will be placed in 'bionic/libc/kernel/arch-<arch>/asm', |
| 'bionic/libc/kernel/common', etc.. |
| """ % { "progname" : os.path.basename(sys.argv[0]) } |
| sys.exit(0) |
| |
| try: |
| optlist, args = getopt.getopt(sys.argv[1:], '') |
| except: |
| # unrecognized option |
| sys.stderr.write("error: unrecognized option\n") |
| usage() |
| |
| if len(optlist) > 0 or len(args) > 2: |
| usage() |
| |
| modified_dir = get_kernel_headers_modified_dir() |
| if len(args) == 1 or len(args) == 2: |
| original_dir = args[0] |
| if not os.path.isdir(original_dir): |
| panic("Not a directory: %s\n" % original_dir) |
| |
| if len(args) == 2: |
| modified_dir = args[1] |
| if not os.path.isdir(modified_dir): |
| panic("Not a directory: %s\n" % modified_dir) |
| else: |
| original_dir = get_kernel_headers_original_dir() |
| if not os.path.isdir(original_dir): |
| panic("Missing directory, please specify one through command-line: %s\n" % original_dir) |
| |
| if not os.path.isdir(modified_dir): |
| modified_dir = None |
| |
| # Find all source files in 'original'. |
| sources = dict() |
| original_dir = os.path.normpath(original_dir) |
| original_dir_len = len(original_dir) + 1 |
| for root, _, files in os.walk(original_dir): |
| for file in files: |
| _, ext = os.path.splitext(file) |
| if ext == ".h": |
| rel_path = os.path.normpath(os.path.join(root, file)) |
| rel_path = rel_path[original_dir_len:] |
| # Check to see if there is a modified header to use instead. |
| if modified_dir and os.path.exists(os.path.join(modified_dir, rel_path)): |
| sources[rel_path] = False |
| else: |
| sources[rel_path] = True |
| |
| |
| b = BatchFileUpdater() |
| |
| kernel_dir = get_kernel_dir() |
| for arch in kernel_archs: |
| b.readDir(os.path.join(kernel_dir, "arch-%s" % arch)) |
| |
| b.readDir(os.path.join(kernel_dir, "common")) |
| |
| oldlen = 120 |
| android_root_len = len(get_android_root()) + 1 |
| for rel_path in sorted(sources): |
| if sources[rel_path]: |
| src_dir = original_dir |
| src_str = "<original>/" |
| else: |
| src_dir = modified_dir |
| src_str = "<modified>/" |
| dst_path, newdata = clean_header.cleanupFile(kernel_dir, src_dir, rel_path) |
| if not dst_path: |
| continue |
| |
| dst_path = os.path.join(kernel_dir, dst_path) |
| b.readFile(dst_path) |
| r = b.editFile(dst_path, newdata) |
| if r == 0: |
| state = "unchanged" |
| elif r == 1: |
| state = "edited" |
| else: |
| state = "added" |
| |
| # dst_path is guaranteed to include android root. |
| rel_dst_path = dst_path[android_root_len:] |
| str = "cleaning: %-*s -> %-*s (%s)" % (35, src_str + rel_path, 35, rel_dst_path, state) |
| if sys.stdout.isatty(): |
| print "%-*s" % (oldlen, str), |
| if (r == 0): |
| print "\r", |
| else: |
| print "\n", |
| oldlen = 0 |
| else: |
| print str |
| |
| oldlen = len(str) |
| |
| print "%-*s" % (oldlen, "Done!") |
| |
| b.updateGitFiles() |
| |
| sys.exit(0) |