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