diff options
author | David 'Digit' Turner <digit@google.com> | 2010-10-11 22:11:06 +0200 |
---|---|---|
committer | David 'Digit' Turner <digit@google.com> | 2011-02-03 18:07:41 +0100 |
commit | fc2693110ee8a2ba22a445ad9855fbe9e118d439 (patch) | |
tree | 6bbfcf0620780f454b5c0ac2dbd5341a00cfa157 /libc/tools | |
parent | 040e18f362716c0bab1d9c39a869b98d6c61584c (diff) | |
download | bionic-fc2693110ee8a2ba22a445ad9855fbe9e118d439.zip bionic-fc2693110ee8a2ba22a445ad9855fbe9e118d439.tar.gz bionic-fc2693110ee8a2ba22a445ad9855fbe9e118d439.tar.bz2 |
libc: Update auto-gen scripts
Make the scripts use external/kernel-headers/original by default.
clean_header.py: Document -k<path>, add -d<path>
find_headers.py: Make kernel config files optional
update_all.py: Allow setting the path to kernel headers on the command-line
update_all.py: Better formatting of output on ttys
update_all.py: Automatically perform "git add/rm" on affected files.
SYSCALLS.TXT: Fix typo in __socketcall definition.
checksyscalls.py: Add support for superH architecture in the checks.
gensyscalls.py: Automatically perform "git add/rm" on affected files.
cpp.py: Fixed a bug that prevented certain type definitions to
be kept in the generated clean header (e.g.
struct ethtool_drvinfo in <linux/ethtool.h>)
All scripts will use the content of external/kernel-headers/original by default now.
The generated code removes all empty lines and trailing whitespace. This is useful
to ensure a unified output even if we change the parser again in the future.
The top-level disclaimer has been edited with update instructions to regenerate
the headers when needed.
Also, a warning is now inserted every 8th line in the final output:
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
Changes under kernel/arch-arm and kernel/arch-x86 should correspond to whitespace
differences and additionnal struct definitions that were missed by the previous
parser implementation.
Change-Id: Icd1c056bacd766759f3e9b7bb5d63a246f3d656a
WARNING: If you run these script, do not submit the result to gerrit for now.
It seems there are discrepancies between the content of original headers
and those currently commited under bionic/libc/kernel/.
(This problem is the main motivation to insert the warning repeatedly).
Current list of issues:
- Missing SuperH headers (i.e. external/kernel-headers/original/asm-sh)
Diffstat (limited to 'libc/tools')
-rw-r--r-- | libc/tools/bionic_utils.py | 59 | ||||
-rwxr-xr-x | libc/tools/checksyscalls.py | 85 | ||||
-rwxr-xr-x | libc/tools/gensyscalls.py | 25 |
3 files changed, 113 insertions, 56 deletions
diff --git a/libc/tools/bionic_utils.py b/libc/tools/bionic_utils.py index 17eef13..e7c8c2d 100644 --- a/libc/tools/bionic_utils.py +++ b/libc/tools/bionic_utils.py @@ -105,8 +105,29 @@ def find_bionic_root(): else: return None +def find_original_kernel_headers(): + """try to find the directory containing the original kernel headers""" + bionic_root = find_bionic_root() + if not bionic_root: + D("Could not find Bionic root !!") + return None + + path = os.path.normpath(bionic_root + "/../../external/kernel-headers/original") + if not os.path.isdir(path): + D("Could not find %s" % (path)) + return None + + return path + def find_kernel_headers(): """try to find the directory containing the kernel headers for this machine""" + + # First try to find the original kernel headers. + ret = find_original_kernel_headers() + if ret: + D("found original kernel headers in: %s" % (ret)) + return ret + status, version = commands.getstatusoutput( "uname -r" ) # get Linux kernel version if status != 0: D("could not execute 'uname -r' command properly") @@ -116,14 +137,39 @@ def find_kernel_headers(): if len(version) > 5 and version[-5:] == "-xenU": version = version[:-5] - path = "/usr/src/linux-headers-" + version - D("probing %s for kernel headers" % (path+"/include")) + path = "/usr/src/linux-headers-" + version + "/include" + D("probing %s for kernel headers" % (path)) ret = os.path.isdir( path ) if ret: - D("found kernel headers in: %s" % (path + "/include")) + D("found kernel headers in: %s" % (path)) return path return None +def find_arch_header(kernel_headers,arch,header): + # First, try in <root>/arch/<arm>/include/<header> + # corresponding to the location in the kernel source tree for + # certain architectures (e.g. arm). + path = "%s/arch/%s/include/asm/%s" % (kernel_headers, arch, header) + D("Probing for %s" % path) + if os.path.exists(path): + return path + + # Try <root>/asm-<arch>/include/<header> corresponding to the location + # in the kernel source tree for other architectures (e.g. x86). + path = "%s/include/asm-%s/%s" % (kernel_headers, arch, header) + D("Probing for %s" % path) + if os.path.exists(path): + return path + + # Otherwise, look under <root>/asm-<arch>/<header> corresponding + # the original kernel headers directory + path = "%s/asm-%s/%s" % (kernel_headers, arch, header) + D("Probing for %s" % path) + if os.path.exists(path): + return path + + + return None # parser for the SYSCALLS.TXT file # @@ -212,7 +258,12 @@ class SysCallsTxtParser: E("invalid syscall number in '%s'" % line) return - print str(syscall_id) + ':' + str(syscall_id2) + ':' + str(syscall_id3) + global verbose + if verbose >= 2: + if call_id < 0: + print "%s: %d,%d,%d" % (syscall_name, syscall_id, syscall_id2, syscall_id3) + else: + print "%s(%d): %d,%d,%d" % (syscall_name, call_id, syscall_id, syscall_id2, syscall_id3) t = { "id" : syscall_id, "id2" : syscall_id2, diff --git a/libc/tools/checksyscalls.py b/libc/tools/checksyscalls.py index 9edb390..f642e84 100755 --- a/libc/tools/checksyscalls.py +++ b/libc/tools/checksyscalls.py @@ -40,8 +40,8 @@ def parse_command_line(args): if len(args) == 0: linux_root = find_kernel_headers() if linux_root == None: - print "could not locate this system kernel headers root directory, please" - print "specify one when calling this program, i.e. 'checksyscalls <headers-directory>'" + print "Could not locate original or system kernel headers root directory." + print "Please specify one when calling this program, i.e. 'checksyscalls <headers-directory>'" sys.exit(1) print "using the following kernel headers root: '%s'" % linux_root else: @@ -112,62 +112,63 @@ def process_header(header_file,dict): arm_dict = {} x86_dict = {} +superh_dict = {} - -# remove trailing slash and '/include' from the linux_root, if any +# remove trailing slash from the linux_root, if any if linux_root[-1] == '/': linux_root = linux_root[:-1] -if len(linux_root) > 8 and linux_root[-8:] == '/include': - linux_root = linux_root[:-8] - -arm_unistd = linux_root + "/include/asm-arm/unistd.h" -if not os.path.exists(arm_unistd): - print "WEIRD: could not locate the ARM unistd.h header file" - print "tried searching in '%s'" % arm_unistd - print "maybe using a different set of kernel headers might help" +arm_unistd = find_arch_header(linux_root, "arm", "unistd.h") +if not arm_unistd: + print "WEIRD: Could not locate the ARM unistd.h kernel header file," + print "maybe using a different set of kernel headers might help." sys.exit(1) # on recent kernels, asm-i386 and asm-x64_64 have been merged into asm-x86 # with two distinct unistd_32.h and unistd_64.h definition files. # take care of this here # -x86_unistd = linux_root + "/include/asm-i386/unistd.h" -if not os.path.exists(x86_unistd): - x86_unistd1 = x86_unistd - x86_unistd = linux_root + "/include/asm-x86/unistd_32.h" - if not os.path.exists(x86_unistd): - print "WEIRD: could not locate the i386/x86 unistd.h header file" - print "tried searching in '%s' and '%s'" % (x86_unistd1, x86_unistd) - print "maybe using a different set of kernel headers might help" +x86_unistd = find_arch_header(linux_root, "i386", "unistd.h") +if not x86_unistd: + x86_unistd = find_arch_header(linux_root, "x86", "unistd_32.h") + if not x86_unistd: + print "WEIRD: Could not locate the i386/x86 unistd.h header file," + print "maybe using a different set of kernel headers might help." sys.exit(1) -process_header( linux_root+"/include/asm-arm/unistd.h", arm_dict ) +superh_unistd = find_arch_header(linux_root, "sh", "unistd_32.h") +if not superh_unistd: + print "WEIRD: Could not locate the SuperH unistd.h kernel header file," + print "maybe using a different set of kernel headers might help." + sys.exit(1) + +process_header( arm_unistd, arm_dict ) process_header( x86_unistd, x86_dict ) +process_header( superh_unistd, superh_dict ) # now perform the comparison errors = 0 -for sc in syscalls: - sc_name = sc["name"] - sc_id = sc["id"] - if sc_id >= 0: - if not arm_dict.has_key(sc_name): - print "arm syscall %s not defined !!" % sc_name - errors += 1 - elif arm_dict[sc_name] != sc_id: - print "arm syscall %s should be %d instead of %d !!" % (sc_name, arm_dict[sc_name], sc_id) - errors += 1 - -for sc in syscalls: - sc_name = sc["name"] - sc_id2 = sc["id2"] - if sc_id2 >= 0: - if not x86_dict.has_key(sc_name): - print "x86 syscall %s not defined !!" % sc_name - errors += 1 - elif x86_dict[sc_name] != sc_id2: - print "x86 syscall %s should be %d instead of %d !!" % (sc_name, x86_dict[sc_name], sc_id2) - errors += 1 + +def check_syscalls(archname, idname, arch_dict): + errors = 0 + for sc in syscalls: + sc_name = sc["name"] + sc_id = sc[idname] + if sc_id >= 0: + if not arch_dict.has_key(sc_name): + print "%s syscall %s not defined, should be %d !!" % (archname, sc_name, sc_id) + errors += 1 + elif not arch_dict.has_key(sc_name): + print "%s syscall %s is not implemented!" % (archname, sc_name) + errors += 1 + elif arch_dict[sc_name] != sc_id: + print "%s syscall %s should be %d instead of %d !!" % (archname, sc_name, arch_dict[sc_name], sc_id) + errors += 1 + return errors + +errors += check_syscalls("arm", "id", arm_dict) +errors += check_syscalls("x86", "id2", x86_dict) +errors += check_syscalls("superh", "id3", superh_dict) if errors == 0: print "congratulations, everything's fine !!" diff --git a/libc/tools/gensyscalls.py b/libc/tools/gensyscalls.py index 0535e56..b58754b 100755 --- a/libc/tools/gensyscalls.py +++ b/libc/tools/gensyscalls.py @@ -557,7 +557,7 @@ class State: for sc in self.syscalls: if sc.has_key("asm-arm") and 'arm' in all_archs: fname = "arch-arm/syscalls/%s.S" % sc["func"] - D( ">>> generating "+fname ) + D2( ">>> generating "+fname ) fp = create_file( fname ) fp.write(sc["asm-arm"]) fp.close() @@ -565,7 +565,7 @@ class State: if sc.has_key("asm-thumb") and 'arm' in all_archs: fname = "arch-arm/syscalls/%s.S" % sc["func"] - D( ">>> generating "+fname ) + D2( ">>> generating "+fname ) fp = create_file( fname ) fp.write(sc["asm-thumb"]) fp.close() @@ -573,7 +573,7 @@ class State: if sc.has_key("asm-x86") and 'x86' in all_archs: fname = "arch-x86/syscalls/%s.S" % sc["func"] - D( ">>> generating "+fname ) + D2( ">>> generating "+fname ) fp = create_file( fname ) fp.write(sc["asm-x86"]) fp.close() @@ -581,7 +581,7 @@ class State: if sc.has_key("asm-sh"): fname = "arch-sh/syscalls/%s.S" % sc["func"] - D( ">>> generating "+fname ) + D2( ">>> generating "+fname ) fp = create_file( fname ) fp.write(sc["asm-sh"]) fp.close() @@ -626,7 +626,7 @@ class State: for stub in self.new_stubs + self.other_files: if not os.path.exists( bionic_root + stub ): - # new file, P4 add it + # new file, git add it D( "new file: " + stub) adds.append( bionic_root + stub ) shutil.copyfile( bionic_temp + stub, bionic_root + stub ) @@ -643,16 +643,21 @@ class State: if adds: - commands.getoutput("p4 add " + " ".join(adds)) + commands.getoutput("git add " + " ".join(adds)) if deletes: - commands.getoutput("p4 delete " + " ".join(deletes)) + commands.getoutput("git rm " + " ".join(deletes)) if edits: - commands.getoutput("p4 edit " + - " ".join((bionic_root + file) for file in edits)) for file in edits: shutil.copyfile( bionic_temp + file, bionic_root + file ) + commands.getoutput("git add " + + " ".join((bionic_root + file) for file in edits)) - D("ready to go !!") + commands.getoutput("git add %s%s" % (bionic_root,"SYSCALLS.TXT")) + + if (not adds) and (not deletes) and (not edits): + D("no changes detected!") + else: + D("ready to go!!") D_setlevel(1) |