summaryrefslogtreecommitdiffstats
path: root/meta/classes/package_rpm.bbclass
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2012-02-09 09:51:10 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-03-05 13:14:51 +0000
commitb24ef37460f230dba3dec646a9eabc82a56f0821 (patch)
tree7328af1b74345f880c8989194817489aeb167ad1 /meta/classes/package_rpm.bbclass
parent2b8f2e770e074ee6735440c2e44eb56397857858 (diff)
downloadpoky-b24ef37460f230dba3dec646a9eabc82a56f0821.tar.gz
package_rpm.bbclass: Optimise per file dependency handling
Currently the process for injecting the per file rpm dependencies into rpmbuild is painfully slow. Its done through the repeated execution of a script which has to return the correct value in each case. This continual execution means the CPU usage of rpmbuild is low. This patch allows the option of collapsing the per file dependencies to a per package basis and injecting them through the .spec file. This removes the execution overhead and allows rpmbuild to run at 100% of cpu. Ultimately it would be nice to inject the per file dependencies through the .spec file however that is not currently possible. Since few people use the per file dependency information, this patch goes for the faster approach. It can be enabled if anyone needs it although I'd mention that its being used to us as this code may well go away in the future if nobody complains. (From OE-Core rev: be40f6d0bb80274366af00461112af65687a4de8) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes/package_rpm.bbclass')
-rw-r--r--meta/classes/package_rpm.bbclass169
1 files changed, 104 insertions, 65 deletions
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index 697bb365c5..3ac379d19a 100644
--- a/meta/classes/package_rpm.bbclass
+++ b/meta/classes/package_rpm.bbclass
@@ -8,6 +8,10 @@ RPMBUILD="rpmbuild"
8PKGWRITEDIRRPM = "${WORKDIR}/deploy-rpms" 8PKGWRITEDIRRPM = "${WORKDIR}/deploy-rpms"
9PKGWRITEDIRSRPM = "${DEPLOY_DIR}/sources/deploy-srpm" 9PKGWRITEDIRSRPM = "${DEPLOY_DIR}/sources/deploy-srpm"
10 10
11# Maintaining the perfile dependencies has singificant overhead when writing the
12# packages. When set, this value merges them for efficiency.
13MERGEPERFILEDEPS = "1"
14
11# 15#
12# Update the packages indexes ${DEPLOY_DIR_RPM} 16# Update the packages indexes ${DEPLOY_DIR_RPM}
13# 17#
@@ -460,6 +464,78 @@ EOF
460 fi 464 fi
461} 465}
462 466
467# Construct per file dependencies file
468def write_rpm_perfiledata(srcname, d):
469 workdir = d.getVar('WORKDIR', True)
470 packages = d.getVar('PACKAGES', True)
471 pkgd = d.getVar('PKGD', True)
472
473 def dump_filerdeps(varname, outfile, d):
474 outfile.write("#!/usr/bin/env python\n\n")
475 outfile.write("# Dependency table\n")
476 outfile.write('deps = {\n')
477 for pkg in packages.split():
478 dependsflist_key = 'FILE' + varname + 'FLIST' + "_" + pkg
479 dependsflist = (d.getVar(dependsflist_key, True) or "")
480 for dfile in dependsflist.split():
481 key = "FILE" + varname + "_" + dfile + "_" + pkg
482 depends_dict = bb.utils.explode_dep_versions(d.getVar(key, True) or "")
483 file = dfile.replace("@underscore@", "_")
484 file = file.replace("@closebrace@", "]")
485 file = file.replace("@openbrace@", "[")
486 file = file.replace("@tab@", "\t")
487 file = file.replace("@space@", " ")
488 file = file.replace("@at@", "@")
489 outfile.write('"' + pkgd + file + '" : "')
490 for dep in depends_dict:
491 ver = depends_dict[dep]
492 if dep and ver:
493 ver = ver.replace("(","")
494 ver = ver.replace(")","")
495 outfile.write(dep + " " + ver + " ")
496 else:
497 outfile.write(dep + " ")
498 outfile.write('",\n')
499 outfile.write('}\n\n')
500 outfile.write("import sys\n")
501 outfile.write("while 1:\n")
502 outfile.write("\tline = sys.stdin.readline().strip()\n")
503 outfile.write("\tif not line:\n")
504 outfile.write("\t\tsys.exit(0)\n")
505 outfile.write("\tif line in deps:\n")
506 outfile.write("\t\tprint(deps[line] + '\\n')\n")
507
508 # OE-core dependencies a.k.a. RPM requires
509 outdepends = workdir + "/" + srcname + ".requires"
510
511 try:
512 from __builtin__ import file
513 dependsfile = file(outdepends, 'w')
514 except OSError:
515 raise bb.build.FuncFailed("unable to open spec file for writing.")
516
517 dump_filerdeps('RDEPENDS', dependsfile, d)
518
519 dependsfile.close()
520 os.chmod(outdepends, 0755)
521
522 # OE-core / RPM Provides
523 outprovides = workdir + "/" + srcname + ".provides"
524
525 try:
526 from __builtin__ import file
527 providesfile = file(outprovides, 'w')
528 except OSError:
529 raise bb.build.FuncFailed("unable to open spec file for writing.")
530
531 dump_filerdeps('RPROVIDES', providesfile, d)
532
533 providesfile.close()
534 os.chmod(outprovides, 0755)
535
536 return (outdepends, outprovides)
537
538
463python write_specfile () { 539python write_specfile () {
464 import textwrap 540 import textwrap
465 import oe.packagedata 541 import oe.packagedata
@@ -576,6 +652,17 @@ python write_specfile () {
576 scr = scr[:pos] + 'if [ "$1" = "0" ] ; then\n' + scr[pos:] + '\nfi' 652 scr = scr[:pos] + 'if [ "$1" = "0" ] ; then\n' + scr[pos:] + '\nfi'
577 return scr 653 return scr
578 654
655 def get_perfile(varname, pkg, d):
656 deps = []
657 dependsflist_key = 'FILE' + varname + 'FLIST' + "_" + pkg
658 dependsflist = (d.getVar(dependsflist_key, True) or "")
659 for dfile in dependsflist.split():
660 key = "FILE" + varname + "_" + dfile + "_" + pkg
661 depends = d.getVar(key, True)
662 if depends:
663 deps.append(depends)
664 return " ".join(deps)
665
579 packages = d.getVar('PACKAGES', True) 666 packages = d.getVar('PACKAGES', True)
580 if not packages or packages == '': 667 if not packages or packages == '':
581 bb.debug(1, "No packages; nothing to do") 668 bb.debug(1, "No packages; nothing to do")
@@ -626,6 +713,8 @@ python write_specfile () {
626 spec_files_top = [] 713 spec_files_top = []
627 spec_files_bottom = [] 714 spec_files_bottom = []
628 715
716 perfiledeps = (d.getVar("MERGEPERFILEDEPS", True) or "0") == "0"
717
629 for pkg in packages.split(): 718 for pkg in packages.split():
630 localdata = bb.data.createCopy(d) 719 localdata = bb.data.createCopy(d)
631 720
@@ -679,6 +768,12 @@ python write_specfile () {
679 splitrprerm = localdata.getVar('pkg_prerm', True) 768 splitrprerm = localdata.getVar('pkg_prerm', True)
680 splitrpostrm = localdata.getVar('pkg_postrm', True) 769 splitrpostrm = localdata.getVar('pkg_postrm', True)
681 770
771
772 if not perfiledeps:
773 # Add in summary of per file dependencies
774 splitrdepends = splitrdepends + " " + get_perfile('RDEPENDS', pkg, d)
775 splitrprovides = splitrprovides + " " + get_perfile('RPROVIDES', pkg, d)
776
682 # Gather special src/first package data 777 # Gather special src/first package data
683 if srcname == splitname: 778 if srcname == splitname:
684 srcrdepends = splitrdepends 779 srcrdepends = splitrdepends
@@ -977,69 +1072,9 @@ python do_package_rpm () {
977 d.setVar('OUTSPECFILE', outspecfile) 1072 d.setVar('OUTSPECFILE', outspecfile)
978 bb.build.exec_func('write_specfile', d) 1073 bb.build.exec_func('write_specfile', d)
979 1074
980 # Construct per file dependencies file 1075 perfiledeps = (d.getVar("MERGEPERFILEDEPS", True) or "0") == "0"
981 def dump_filerdeps(varname, outfile, d): 1076 if perfiledeps:
982 outfile.write("#!/usr/bin/env python\n\n") 1077 outdepends, outprovides = write_rpm_perfiledata(srcname, d)
983 outfile.write("# Dependency table\n")
984 outfile.write('deps = {\n')
985 for pkg in packages.split():
986 dependsflist_key = 'FILE' + varname + 'FLIST' + "_" + pkg
987 dependsflist = (d.getVar(dependsflist_key, True) or "")
988 for dfile in dependsflist.split():
989 key = "FILE" + varname + "_" + dfile + "_" + pkg
990 depends_dict = bb.utils.explode_dep_versions(d.getVar(key, True) or "")
991 file = dfile.replace("@underscore@", "_")
992 file = file.replace("@closebrace@", "]")
993 file = file.replace("@openbrace@", "[")
994 file = file.replace("@tab@", "\t")
995 file = file.replace("@space@", " ")
996 file = file.replace("@at@", "@")
997 outfile.write('"' + pkgd + file + '" : "')
998 for dep in depends_dict:
999 ver = depends_dict[dep]
1000 if dep and ver:
1001 ver = ver.replace("(","")
1002 ver = ver.replace(")","")
1003 outfile.write(dep + " " + ver + " ")
1004 else:
1005 outfile.write(dep + " ")
1006 outfile.write('",\n')
1007 outfile.write('}\n\n')
1008 outfile.write("import sys\n")
1009 outfile.write("while 1:\n")
1010 outfile.write("\tline = sys.stdin.readline().strip()\n")
1011 outfile.write("\tif not line:\n")
1012 outfile.write("\t\tsys.exit(0)\n")
1013 outfile.write("\tif line in deps:\n")
1014 outfile.write("\t\tprint(deps[line] + '\\n')\n")
1015
1016 # OE-core dependencies a.k.a. RPM requires
1017 outdepends = workdir + "/" + srcname + ".requires"
1018
1019 try:
1020 from __builtin__ import file
1021 dependsfile = file(outdepends, 'w')
1022 except OSError:
1023 raise bb.build.FuncFailed("unable to open spec file for writing.")
1024
1025 dump_filerdeps('RDEPENDS', dependsfile, d)
1026
1027 dependsfile.close()
1028 os.chmod(outdepends, 0755)
1029
1030 # OE-core / RPM Provides
1031 outprovides = workdir + "/" + srcname + ".provides"
1032
1033 try:
1034 from __builtin__ import file
1035 providesfile = file(outprovides, 'w')
1036 except OSError:
1037 raise bb.build.FuncFailed("unable to open spec file for writing.")
1038
1039 dump_filerdeps('RPROVIDES', providesfile, d)
1040
1041 providesfile.close()
1042 os.chmod(outprovides, 0755)
1043 1078
1044 # Setup the rpmbuild arguments... 1079 # Setup the rpmbuild arguments...
1045 rpmbuild = d.getVar('RPMBUILD', True) 1080 rpmbuild = d.getVar('RPMBUILD', True)
@@ -1062,8 +1097,12 @@ python do_package_rpm () {
1062 cmd = cmd + " --define '_topdir " + workdir + "' --define '_rpmdir " + pkgwritedir + "'" 1097 cmd = cmd + " --define '_topdir " + workdir + "' --define '_rpmdir " + pkgwritedir + "'"
1063 cmd = cmd + " --define '_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm'" 1098 cmd = cmd + " --define '_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm'"
1064 cmd = cmd + " --define '_use_internal_dependency_generator 0'" 1099 cmd = cmd + " --define '_use_internal_dependency_generator 0'"
1065 cmd = cmd + " --define '__find_requires " + outdepends + "'" 1100 if perfiledeps:
1066 cmd = cmd + " --define '__find_provides " + outprovides + "'" 1101 cmd = cmd + " --define '__find_requires " + outdepends + "'"
1102 cmd = cmd + " --define '__find_provides " + outprovides + "'"
1103 else:
1104 cmd = cmd + " --define '__find_requires %{nil}'"
1105 cmd = cmd + " --define '__find_provides %{nil}'"
1067 cmd = cmd + " --define '_unpackaged_files_terminate_build 0'" 1106 cmd = cmd + " --define '_unpackaged_files_terminate_build 0'"
1068 cmd = cmd + " --define 'debug_package %{nil}'" 1107 cmd = cmd + " --define 'debug_package %{nil}'"
1069 cmd = cmd + " --define '_rpmfc_magic_path " + magicfile + "'" 1108 cmd = cmd + " --define '_rpmfc_magic_path " + magicfile + "'"