]> code.ossystems Code Review - openembedded-core.git/commitdiff
package_rpm: Enable per file dependencies
authorMark Hatle <mark.hatle@windriver.com>
Mon, 30 Aug 2010 21:44:31 +0000 (16:44 -0500)
committerRichard Purdie <rpurdie@linux.intel.com>
Thu, 2 Sep 2010 09:01:22 +0000 (10:01 +0100)
Switch the per file dependency handing to passing the information to
rpm via the standard 'external' dependency scripting.  This ensures that
the dependencies found by RPM exactly match the ones presented by
package.bbclass.

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
meta/classes/package.bbclass
meta/classes/package_rpm.bbclass

index 9ae7ecca0c4715d66a4ac6102cca86c270a9961b..f0a874802389296f6c22073d107ad1a7e7635cd8 100644 (file)
@@ -594,6 +594,8 @@ python package_do_filedeps() {
                                value = line_list[1]
                                file = file.replace(pkgdest + "/" + pkg, "")
                                file = file.replace("@", "@at@")
+                               file = file.replace(" ", "@space@")
+                               file = file.replace("\t", "@tab@")
                                file = file.replace("[", "@openbrace@")
                                file = file.replace("]", "@closebrace@")
                                file = file.replace("_", "@underscore@")
index ad5c6a13adbc46f21aef2a4d6b935e8afa48a067..36eb8e308b90159ee851dba2c6aedbde62cb1d55 100644 (file)
@@ -187,24 +187,6 @@ python write_specfile () {
                splitsection = (bb.data.getVar('SECTION', localdata, True) or "")
                splitdescription = (bb.data.getVar('DESCRIPTION', localdata, True) or "")
 
-               # Roll up the per file dependencies into package level dependencies
-               def roll_filerdeps(varname, d):
-                       depends = bb.utils.explode_dep_versions(bb.data.getVar(varname, d, True) or "")
-                       dependsflist_key = 'FILE' + varname + 'FLIST'
-                       dependsflist = (bb.data.getVar(dependsflist_key, d, True) or "")
-                       for dfile in dependsflist.split():
-                               key = "FILE" + varname + "_" + dfile
-                               filedepends = bb.utils.explode_dep_versions(bb.data.getVar(key, d, True) or "")
-                               bb.utils.extend_deps(depends, filedepends)
-                       bb.data.setVar(varname, bb.utils.join_deps(depends), d)
-
-               roll_filerdeps('RDEPENDS', localdata)
-               roll_filerdeps('RRECOMMENDS', localdata)
-               roll_filerdeps('RSUGGESTS', localdata)
-               roll_filerdeps('RPROVIDES', localdata)
-               roll_filerdeps('RREPLACES', localdata)
-               roll_filerdeps('RCONFLICTS', localdata)
-
                translate_vers('RDEPENDS', localdata)
                translate_vers('RRECOMMENDS', localdata)
                translate_vers('RSUGGESTS', localdata)
@@ -457,6 +439,66 @@ python do_package_rpm () {
        bb.data.setVar('OUTSPECFILE', outspecfile, d)
        bb.build.exec_func('write_specfile', d)
 
+       # Construct per file dependencies file
+       def dump_filerdeps(varname, outfile, d):
+               outfile.write("#!/bin/sh\n")
+               outfile.write("\n# Dependency table\n")
+               for pkg in packages.split():
+                       dependsflist_key = 'FILE' + varname + 'FLIST' + "_" + pkg
+                       dependsflist = (bb.data.getVar(dependsflist_key, d, True) or "")
+                       for dfile in dependsflist.split():
+                               key = "FILE" + varname + "_" + dfile + "_" + pkg
+                               depends_dict = bb.utils.explode_dep_versions(bb.data.getVar(key, d, True) or "")
+                               file = dfile.replace("@underscore@", "_")
+                               file = file.replace("@closebrace@", "]")
+                               file = file.replace("@openbrace@", "[")
+                               file = file.replace("@tab@", "\t")
+                               file = file.replace("@space@", " ")
+                               file = file.replace("@at@", "@")
+                               outfile.write("#" + pkgd + file + "\t")
+                               for dep in depends_dict:
+                                       ver = depends_dict[dep]
+                                       if dep and ver:
+                                               ver = ver.replace("(","")
+                                               ver = ver.replace(")","")
+                                               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")
+
+       # Poky dependencies a.k.a. RPM requires
+       outdepends = workdir + "/" + srcname + ".requires"
+
+       try:
+               from __builtin__ import file
+               dependsfile = file(outdepends, 'w')
+       except OSError:
+               raise bb.build.FuncFailed("unable to open spec file for writing.")
+
+       dump_filerdeps('RDEPENDS', dependsfile, d)
+
+       dependsfile.close()
+       os.chmod(outdepends, 0755)
+
+       # Poky / RPM Provides
+       outprovides = workdir + "/" + srcname + ".requires"
+
+       try:
+               from __builtin__ import file
+               providesfile = file(outprovides, 'w')
+       except OSError:
+               raise bb.build.FuncFailed("unable to open spec file for writing.")
+
+       dump_filerdeps('RPROVIDES', providesfile, d)
+
+       providesfile.close()
+       os.chmod(outprovides, 0755)
+
        # Setup the rpmbuild arguments...
        rpmbuild = bb.data.getVar('RPMBUILD', d, True)
        targetsys = bb.data.getVar('TARGET_SYS', d, True)
@@ -469,6 +511,9 @@ python do_package_rpm () {
        cmd = cmd + " --nodeps --short-circuit --target " + pkgarch + " --buildroot " + pkgd
        cmd = cmd + " --define '_topdir " + workdir + "' --define '_rpmdir " + pkgwritedir + "'"
        cmd = cmd + " --define '_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm'"
+       cmd = cmd + " --define '_use_internal_dependency_generator 0'"
+       cmd = cmd + " --define '__find_requires " + outdepends + "'"
+       cmd = cmd + " --define '__find_provides " + outprovides + "'"
        cmd = cmd + " -bb " + outspecfile
 
        # Build the spec file!