blob: 7f3657c2007cb8e2fe9ba1e91d9490a327ac7d62 [file] [log] [blame]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08001#!/usr/bin/env python
2#
Christopher Ferris38062f92014-07-09 15:33:25 -07003import sys, cpp, kernel, glob, os, re, getopt, clean_header, subprocess
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08004from defaults import *
5from utils import *
6
7def usage():
8 print """\
Christopher Ferrisd12c3322015-09-15 14:13:17 -07009 usage: %(progname)s [kernel-original-path] [kernel-modified-path]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080010
11 this program is used to update all the auto-generated clean headers
12 used by the Bionic C library. it assumes the following:
13
Christopher Ferrisd12c3322015-09-15 14:13:17 -070014 - a set of source kernel headers is located in
15 'external/kernel-headers/original', relative to the current
16 android tree
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080017
Christopher Ferrisd12c3322015-09-15 14:13:17 -070018 - a set of manually modified kernel header files located in
19 'external/kernel-headers/modified', relative to the current
20 android tree
21
22 - the clean headers will be placed in 'bionic/libc/kernel/arch-<arch>/asm',
23 'bionic/libc/kernel/common', etc..
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080024""" % { "progname" : os.path.basename(sys.argv[0]) }
25 sys.exit(0)
26
27try:
Christopher Ferrisd12c3322015-09-15 14:13:17 -070028 optlist, args = getopt.getopt(sys.argv[1:], '')
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080029except:
30 # unrecognized option
Christopher Ferrisd12c3322015-09-15 14:13:17 -070031 sys.stderr.write("error: unrecognized option\n")
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080032 usage()
33
Christopher Ferrisd12c3322015-09-15 14:13:17 -070034if len(optlist) > 0 or len(args) > 2:
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080035 usage()
36
Christopher Ferrisd12c3322015-09-15 14:13:17 -070037modified_dir = get_kernel_headers_modified_dir()
38if len(args) == 1 or len(args) == 2:
Glenn Kastenc61f9902011-12-19 11:27:50 -080039 original_dir = args[0]
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020040 if not os.path.isdir(original_dir):
Christopher Ferrisd12c3322015-09-15 14:13:17 -070041 panic("Not a directory: %s\n" % original_dir)
42
43 if len(args) == 2:
44 modified_dir = args[1]
45 if not os.path.isdir(modified_dir):
46 panic("Not a directory: %s\n" % modified_dir)
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020047else:
Christopher Ferrisd12c3322015-09-15 14:13:17 -070048 original_dir = get_kernel_headers_original_dir()
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020049 if not os.path.isdir(original_dir):
Christopher Ferrisd12c3322015-09-15 14:13:17 -070050 panic("Missing directory, please specify one through command-line: %s\n" % original_dir)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080051
Christopher Ferrisd12c3322015-09-15 14:13:17 -070052if not os.path.isdir(modified_dir):
53 modified_dir = None
Christopher Ferris38062f92014-07-09 15:33:25 -070054
Christopher Ferrisd12c3322015-09-15 14:13:17 -070055# Find all source files in 'original'.
56sources = dict()
57original_dir = os.path.normpath(original_dir)
58original_dir_len = len(original_dir) + 1
59for root, _, files in os.walk(original_dir):
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080060 for file in files:
Christopher Ferrisd12c3322015-09-15 14:13:17 -070061 _, ext = os.path.splitext(file)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080062 if ext == ".h":
Christopher Ferrisd12c3322015-09-15 14:13:17 -070063 rel_path = os.path.normpath(os.path.join(root, file))
64 rel_path = rel_path[original_dir_len:]
65 # Check to see if there is a modified header to use instead.
66 if modified_dir and os.path.exists(os.path.join(modified_dir, rel_path)):
67 sources[rel_path] = False
68 else:
69 sources[rel_path] = True
70
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080071
72b = BatchFileUpdater()
73
Christopher Ferrisd12c3322015-09-15 14:13:17 -070074kernel_dir = get_kernel_dir()
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080075for arch in kernel_archs:
Christopher Ferrisd12c3322015-09-15 14:13:17 -070076 b.readDir(os.path.join(kernel_dir, "arch-%s" % arch))
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080077
Christopher Ferrisd12c3322015-09-15 14:13:17 -070078b.readDir(os.path.join(kernel_dir, "common"))
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080079
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020080oldlen = 120
Christopher Ferrisd12c3322015-09-15 14:13:17 -070081android_root_len = len(get_android_root()) + 1
82for rel_path in sorted(sources):
83 if sources[rel_path]:
84 src_dir = original_dir
85 src_str = "<original>/"
86 else:
87 src_dir = modified_dir
88 src_str = "<modified>/"
89 dst_path, newdata = clean_header.cleanupFile(kernel_dir, src_dir, rel_path)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080090 if not dst_path:
91 continue
92
Christopher Ferrisd12c3322015-09-15 14:13:17 -070093 dst_path = os.path.join(kernel_dir, dst_path)
94 b.readFile(dst_path)
95 r = b.editFile(dst_path, newdata)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080096 if r == 0:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020097 state = "unchanged"
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080098 elif r == 1:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020099 state = "edited"
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800100 else:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200101 state = "added"
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800102
Christopher Ferrisd12c3322015-09-15 14:13:17 -0700103 # dst_path is guaranteed to include android root.
104 rel_dst_path = dst_path[android_root_len:]
105 str = "cleaning: %-*s -> %-*s (%s)" % (35, src_str + rel_path, 35, rel_dst_path, state)
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200106 if sys.stdout.isatty():
Christopher Ferrisd12c3322015-09-15 14:13:17 -0700107 print "%-*s" % (oldlen, str),
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200108 if (r == 0):
109 print "\r",
110 else:
111 print "\n",
112 oldlen = 0
113 else:
114 print str
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800115
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200116 oldlen = len(str)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800117
Christopher Ferrisd12c3322015-09-15 14:13:17 -0700118print "%-*s" % (oldlen, "Done!")
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200119
120b.updateGitFiles()
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800121
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800122sys.exit(0)