blob: 5031168ce6765812a565c42a27e33f8f91947e1d [file] [log] [blame]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08001#!/usr/bin/env python
2#
Christopher Ferris5956b4e2016-07-20 12:28:56 -07003import sys, cpp, kernel, glob, os, re, getopt, clean_header, subprocess, shutil
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',
Christopher Ferris5956b4e2016-07-20 12:28:56 -070023 'bionic/libc/kernel/android', 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 Ferris5956b4e2016-07-20 12:28:56 -070078b.readDir(os.path.join(kernel_dir, "android"))
79
80# Delete the old uapi headers before updating to handle headers that
81# get moved/deleted.
82uapi_dir = os.path.join(get_kernel_dir(), "uapi")
83shutil.rmtree(uapi_dir)
84os.mkdir(uapi_dir, 0755)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080085
David 'Digit' Turnerfc269312010-10-11 22:11:06 +020086oldlen = 120
Christopher Ferrisd12c3322015-09-15 14:13:17 -070087android_root_len = len(get_android_root()) + 1
88for rel_path in sorted(sources):
89 if sources[rel_path]:
90 src_dir = original_dir
91 src_str = "<original>/"
92 else:
93 src_dir = modified_dir
94 src_str = "<modified>/"
95 dst_path, newdata = clean_header.cleanupFile(kernel_dir, src_dir, rel_path)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080096 if not dst_path:
97 continue
98
Christopher Ferrisd12c3322015-09-15 14:13:17 -070099 dst_path = os.path.join(kernel_dir, dst_path)
100 b.readFile(dst_path)
101 r = b.editFile(dst_path, newdata)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800102 if r == 0:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200103 state = "unchanged"
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800104 elif r == 1:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200105 state = "edited"
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800106 else:
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200107 state = "added"
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800108
Christopher Ferrisd12c3322015-09-15 14:13:17 -0700109 # dst_path is guaranteed to include android root.
110 rel_dst_path = dst_path[android_root_len:]
111 str = "cleaning: %-*s -> %-*s (%s)" % (35, src_str + rel_path, 35, rel_dst_path, state)
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200112 if sys.stdout.isatty():
Christopher Ferrisd12c3322015-09-15 14:13:17 -0700113 print "%-*s" % (oldlen, str),
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200114 if (r == 0):
115 print "\r",
116 else:
117 print "\n",
118 oldlen = 0
119 else:
120 print str
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800121
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200122 oldlen = len(str)
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800123
Christopher Ferrisd12c3322015-09-15 14:13:17 -0700124print "%-*s" % (oldlen, "Done!")
David 'Digit' Turnerfc269312010-10-11 22:11:06 +0200125
126b.updateGitFiles()
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800127
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800128sys.exit(0)