#!/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)