blob: 0549fc24e072101f007184d364e432fa720eb0a2 [file] [log] [blame]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08001#!/usr/bin/env python
2#
3
4import sys, cpp, kernel, glob, os, re, getopt
5from defaults import *
6from utils import *
7
8noUpdate = 1
9
Frank Maker7b6795d2011-05-25 11:07:04 -070010def cleanupFile( path, original_path):
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080011 """reads an original header and perform the cleanup operation on it
12 this functions returns the destination path and the clean header
13 as a single string"""
14 # check the header path
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020015 src_path = path
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080016
17 if not os.path.exists(src_path):
18 if noUpdate:
19 panic( "file does not exist: '%s'\n" % path )
20 sys.stderr.write( "warning: file does not exit: %s\n" % path )
21 return None, None
22
23 if not os.path.isfile(src_path):
24 if noUpdate:
25 panic( "path is not a file: '%s'\n" % path )
26 sys.stderr.write( "warning: not a file: %s\n" % path )
27 return None, None
28
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080029 if os.path.commonprefix( [ src_path, original_path ] ) != original_path:
30 if noUpdate:
31 panic( "file is not in 'original' directory: %s\n" % path );
32 sys.stderr.write( "warning: file not in 'original' ignored: %s\n" % path )
33 return None, None
34
35 src_path = src_path[len(original_path):]
36 if len(src_path) > 0 and src_path[0] == '/':
37 src_path = src_path[1:]
38
39 if len(src_path) == 0:
40 panic( "oops, internal error, can't extract correct relative path" )
41
42 # convert into destination path, extracting architecture if needed
43 # and the corresponding list of known static functions
44 #
45 arch = None
46 re_asm_arch = re.compile( r"asm-([\w\d_\+\.\-]+)(/.*)" )
47 m = re_asm_arch.match(src_path)
48 statics = kernel_known_generic_statics
49 if m and m.group(1) != 'generic':
50 dst_path = "arch-%s/asm/%s" % m.groups()
51 arch = m.group(1)
52 statics = statics.union( kernel_known_statics.get( arch, set() ) )
53 else:
54 dst_path = "common/" + src_path
55
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020056 dst_path = os.path.normpath( kernel_cleaned_path + "/" + dst_path )
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080057
58 # now, let's parse the file
59 #
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020060 blocks = cpp.BlockParser().parseFile(path)
61 if not blocks:
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080062 sys.stderr.write( "error: can't parse '%s'" % path )
63 sys.exit(1)
64
65
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020066 blocks.optimizeMacros( kernel_known_macros )
67 blocks.optimizeIf01()
68 blocks.removeVarsAndFuncs( statics )
69 blocks.replaceTokens( kernel_token_replacements )
70 blocks.removeComments()
71 blocks.removeMacroDefines( kernel_ignored_macros )
72 blocks.removeWhiteSpace()
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080073
74 out = StringOutput()
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020075 out.write( kernel_disclaimer )
76 blocks.writeWithWarning(out, kernel_warning, 4)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080077 return dst_path, out.get()
78
79
80if __name__ == "__main__":
81
82 def usage():
83 print """\
84 usage: %s [options] <header_path>
85
86 options:
87 -v enable verbose mode
88
89 -u enabled update mode
90 this will try to update the corresponding 'clean header'
91 if the content has changed. with this, you can pass more
92 than one file on the command-line
93
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020094 -k<path> specify path of original kernel headers
95 -d<path> specify path of cleaned kernel headers
96
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080097 <header_path> must be in a subdirectory of 'original'
98 """ % os.path.basename(sys.argv[0])
99 sys.exit(1)
100
101 try:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200102 optlist, args = getopt.getopt( sys.argv[1:], 'uvk:d:' )
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800103 except:
104 # unrecognized option
105 sys.stderr.write( "error: unrecognized option\n" )
106 usage()
107
108 for opt, arg in optlist:
109 if opt == '-u':
110 noUpdate = 0
111 elif opt == '-v':
112 verbose = 1
113 D_setlevel(1)
Dima Zavin4c4a9632009-08-05 17:55:30 -0700114 elif opt == '-k':
115 kernel_original_path = arg
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200116 elif opt == '-d':
117 kernel_cleaned_path = arg
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800118
119 if len(args) == 0:
120 usage()
121
122 if noUpdate:
123 for path in args:
Frank Maker7b6795d2011-05-25 11:07:04 -0700124 dst_path, newdata = cleanupFile(path,kernel_original_path)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800125 print newdata
126
127 sys.exit(0)
128
129 # now let's update our files.
130
131 b = BatchFileUpdater()
132
133 for path in args:
Frank Maker7b6795d2011-05-25 11:07:04 -0700134 dst_path, newdata = cleanupFile(path,kernel_original_path)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800135 if not dst_path:
136 continue
137
138 b.readFile( dst_path )
139 r = b.editFile( dst_path, newdata )
140 if r == 0:
141 r = "unchanged"
142 elif r == 1:
143 r = "edited"
144 else:
145 r = "added"
146
147 print "cleaning: %-*s -> %-*s (%s)" % ( 35, path, 35, dst_path, r )
148
149
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200150 b.updateGitFiles()
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800151
152 sys.exit(0)