]> code.ossystems Code Review - openembedded-core.git/commitdiff
package_rpm.bbclass: Replace shell provides/requires script with python version
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 26 Apr 2012 19:54:23 +0000 (20:54 +0100)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 26 Apr 2012 21:07:54 +0000 (22:07 +0100)
The existing shell script is a fork bomb and forks off hundreds of
grep/cur/wc calls as it reads from its input stream and iterates over
the file data table for each line of input. This patch replaces the
shell code with python code which doesn't exec anything and hence runs
much faster without the exec() overhead. This speeds up rpm packaging
considerably, as can be measured simply by timing it, or watching the
processor utilisation.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/package_rpm.bbclass

index ffe3b312ff664234751083f7de5f86e7d43e30af..d90976b65dc6e8d0f6b492be59682f9a5cff080c 100644 (file)
@@ -1004,8 +1004,9 @@ python do_package_rpm () {
 
        # Construct per file dependencies file
        def dump_filerdeps(varname, outfile, d):
-               outfile.write("#!/bin/sh\n")
-               outfile.write("\n# Dependency table\n")
+               outfile.write("#!/usr/bin/env python\n\n")
+               outfile.write("# Dependency table\n")
+               outfile.write('deps = {\n')
                for pkg in packages.split():
                        dependsflist_key = 'FILE' + varname + 'FLIST' + "_" + pkg
                        dependsflist = (d.getVar(dependsflist_key, True) or "")
@@ -1018,7 +1019,7 @@ python do_package_rpm () {
                                file = file.replace("@tab@", "\t")
                                file = file.replace("@space@", " ")
                                file = file.replace("@at@", "@")
-                               outfile.write("#" + pkgd + file + "\t")
+                               outfile.write('"' + pkgd + file + '" : "')
                                for dep in depends_dict:
                                        ver = depends_dict[dep]
                                        if dep and ver:
@@ -1027,12 +1028,15 @@ python do_package_rpm () {
                                                outfile.write(dep + " " + ver + " ")
                                        else:
                                                outfile.write(dep + " ")
-                               outfile.write("\n")
-               outfile.write("\n\nwhile read file_name ; do\n")
-               outfile.write("\tlength=$(echo \"#${file_name}\t\" | wc -c )\n")
-               outfile.write("\tline=$(grep \"^#${file_name}\t\" $0 | cut -c ${length}- )\n")
-               outfile.write("\tprintf \"%s\\n\" ${line}\n")
-               outfile.write("done\n")
+                               outfile.write('",\n')
+               outfile.write('}\n\n')
+               outfile.write("import sys\n")
+               outfile.write("while 1:\n")
+               outfile.write("\tline = sys.stdin.readline().strip()\n")
+               outfile.write("\tif not line:\n")
+               outfile.write("\t\tsys.exit(0)\n")
+               outfile.write("\tif line in deps:\n")
+               outfile.write("\t\tprint(deps[line] + '\\n')\n")
 
        # OE-core dependencies a.k.a. RPM requires
        outdepends = workdir + "/" + srcname + ".requires"