blob: 01569fc8043d6bf8aff673f9d9630d3e6b02f23a [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:
Glenn Kastenc61f9902011-12-19 11:27:50 -080040 panic( "oops, internal error, can't extract correct relative path\n" )
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080041
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
Andrew Hsieh126601d2012-03-23 23:07:36 +080065 macros = kernel_known_macros.copy()
66 if arch and arch in kernel_default_arch_macros:
67 macros.update(kernel_default_arch_macros[arch])
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080068
Andrew Hsieh126601d2012-03-23 23:07:36 +080069 blocks.optimizeMacros( macros )
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020070 blocks.optimizeIf01()
71 blocks.removeVarsAndFuncs( statics )
72 blocks.replaceTokens( kernel_token_replacements )
73 blocks.removeComments()
74 blocks.removeMacroDefines( kernel_ignored_macros )
75 blocks.removeWhiteSpace()
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080076
77 out = StringOutput()
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020078 out.write( kernel_disclaimer )
79 blocks.writeWithWarning(out, kernel_warning, 4)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080080 return dst_path, out.get()
81
82
83if __name__ == "__main__":
84
85 def usage():
86 print """\
87 usage: %s [options] <header_path>
88
89 options:
90 -v enable verbose mode
91
92 -u enabled update mode
93 this will try to update the corresponding 'clean header'
94 if the content has changed. with this, you can pass more
95 than one file on the command-line
96
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020097 -k<path> specify path of original kernel headers
98 -d<path> specify path of cleaned kernel headers
99
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800100 <header_path> must be in a subdirectory of 'original'
101 """ % os.path.basename(sys.argv[0])
102 sys.exit(1)
103
104 try:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200105 optlist, args = getopt.getopt( sys.argv[1:], 'uvk:d:' )
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800106 except:
107 # unrecognized option
108 sys.stderr.write( "error: unrecognized option\n" )
109 usage()
110
111 for opt, arg in optlist:
112 if opt == '-u':
113 noUpdate = 0
114 elif opt == '-v':
115 verbose = 1
116 D_setlevel(1)
Dima Zavin4c4a9632009-08-05 17:55:30 -0700117 elif opt == '-k':
118 kernel_original_path = arg
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200119 elif opt == '-d':
120 kernel_cleaned_path = arg
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800121
122 if len(args) == 0:
123 usage()
124
125 if noUpdate:
126 for path in args:
Frank Maker7b6795d2011-05-25 11:07:04 -0700127 dst_path, newdata = cleanupFile(path,kernel_original_path)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800128 print newdata
129
130 sys.exit(0)
131
132 # now let's update our files.
133
134 b = BatchFileUpdater()
135
136 for path in args:
Frank Maker7b6795d2011-05-25 11:07:04 -0700137 dst_path, newdata = cleanupFile(path,kernel_original_path)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800138 if not dst_path:
139 continue
140
141 b.readFile( dst_path )
142 r = b.editFile( dst_path, newdata )
143 if r == 0:
144 r = "unchanged"
145 elif r == 1:
146 r = "edited"
147 else:
148 r = "added"
149
150 print "cleaning: %-*s -> %-*s (%s)" % ( 35, path, 35, dst_path, r )
151
152
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200153 b.updateGitFiles()
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800154
155 sys.exit(0)