diff options
Diffstat (limited to 'classes/package_rpm.bbclass')
| -rw-r--r-- | classes/package_rpm.bbclass | 166 |
1 files changed, 129 insertions, 37 deletions
diff --git a/classes/package_rpm.bbclass b/classes/package_rpm.bbclass index 4955792916..ab09bb24d3 100644 --- a/classes/package_rpm.bbclass +++ b/classes/package_rpm.bbclass @@ -1,21 +1,28 @@ inherit package -inherit rpm_core RPMBUILD="rpmbuild --short-circuit ${RPMOPTS}" -PACKAGE_WRITE_FUNCS += "do_package_rpm" IMAGE_PKGTYPE ?= "rpm" +RPMBUILDPATH="${WORKDIR}/rpm" + +RPMOPTS="--rcfile=${WORKDIR}/rpmrc" +RPMOPTS="--rcfile=${WORKDIR}/rpmrc --target ${TARGET_SYS}" +RPM="rpm ${RPMOPTS}" + python write_specfile() { - from bb import data, build - import sys + version = bb.data.getVar('PV', d, 1) + version = version.replace('-', '+') + bb.data.setVar('RPMPV', version, d) + out_vartranslate = { "PKG": "Name", - "PV": "Version", - "PR": "Release", + "RPMPV": "Version", "DESCRIPTION": "%description", "ROOT": "BuildRoot", "LICENSE": "License", "SECTION": "Group", + "pkg_postinst": "%post", + "pkg_preinst": "%pre", } root = bb.data.getVar('ROOT', d) @@ -40,9 +47,9 @@ python write_specfile() { del files[files.index(r)] except ValueError: pass - if not files: - from bb import note - note("Not creating empty archive for %s-%s-%s" % (bb.data.getVar('PKG',d, 1), bb.data.getVar('PV', d, 1), bb.data.getVar('PR', d, 1))) + + if not files and bb.data.getVar('ALLOW_EMPTY', d) != "1": + bb.note("Not creating empty archive for %s" % (bb.data.expand('${PKG}-${PV}-${PR}${DISTRO_PR}', d, True))) return # output .spec using this metadata store @@ -54,22 +61,65 @@ python write_specfile() { except OSError: raise bb.build.FuncFailed("unable to open spec file for writing.") -# fd = sys.__stdout__ fd = specfile for var in out_vartranslate.keys(): if out_vartranslate[var][0] == "%": continue - fd.write("%s\t: %s\n" % (out_vartranslate[var], bb.data.getVar(var, d))) + val = bb.data.getVar(var, d, 1) + if val: + fd.write("%s\t: %s\n" % (out_vartranslate[var], val)) + + fd.write("AutoReqProv: no\n") + + def fix_dep_versions(varname): + depends = bb.utils.explode_dep_versions(bb.data.getVar(varname, d, True) or "") + newdeps = [] + for dep in depends: + ver = depends[dep] + if dep and ver: + if '-' in ver: + subd = read_subpkgdata_dict(dep, d) + pv = subd['PV'] + reppv = pv.replace('-', '+') + ver = ver.replace(pv, reppv) + newdeps.append("%s (%s)" % (dep, ver)) + elif dep: + newdeps.append(dep) + bb.data.setVar(varname, " ".join(newdeps), d) + + fix_dep_versions('RDEPENDS') + fix_dep_versions('RRECOMMENDS') + + bb.build.exec_func("mapping_rename_hook", d) + + def write_dep_field(varname, outstring): + depends = bb.utils.explode_dep_versions(bb.data.getVar(varname, d, True) or "") + for dep in depends: + ver = depends[dep] + if dep and ver: + fd.write("%s: %s %s\n" % (outstring, dep, ver)) + elif dep: + fd.write("%s: %s\n" % (outstring, dep)) + + write_dep_field('RDEPENDS', 'Requires') + write_dep_field('RRECOMMENDS', 'Recommends') + write_dep_field('RPROVIDES', 'Provides') + + fd.write("Release\t: %s\n" % bb.data.expand('${PR}${DISTRO_PR}', d, True)) fd.write("Summary\t: .\n") for var in out_vartranslate.keys(): if out_vartranslate[var][0] != "%": continue - fd.write(out_vartranslate[var] + "\n") - fd.write(bb.data.getVar(var, d) + "\n\n") + val = bb.data.getVar(var, d) + if val: + fd.write(out_vartranslate[var] + "\n") + fd.write(val + "\n\n") fd.write("%files\n") for file in files: + if file[0] != '/': + fd.write('/') fd.write("%s\n" % file) fd.close() @@ -81,54 +131,96 @@ python write_specfile() { bb.build.exec_func('BUILDSPEC', d) # move the rpm into the pkgoutdir - rpm = bb.data.expand('${RPMBUILDPATH}/RPMS/${TARGET_ARCH}/${PKG}-${PV}-${PR}.${TARGET_ARCH}.rpm', d) - outrpm = bb.data.expand('${DEPLOY_DIR_RPM}/${PKG}-${PV}-${PR}.${TARGET_ARCH}.rpm', d) + rpm = bb.data.expand('${RPMBUILDPATH}/RPMS/${TARGET_ARCH}/${PKG}-${RPMPV}-${PR}${DISTRO_PR}.${TARGET_ARCH}.rpm', d) + outrpm = bb.data.expand('${DEPLOY_DIR_RPM}/${PACKAGE_ARCH}/${PKG}-${RPMPV}-${PR}.${TARGET_ARCH}.rpm', d) bb.movefile(rpm, outrpm) } +rpm_prep() { + if [ ! -e ${WORKDIR}/rpmrc ]; then + mkdir -p ${RPMBUILDPATH}/{SPECS,RPMS/{i386,i586,i686,noarch,ppc,mips,mipsel,arm},SRPMS,SOURCES,BUILD} + echo 'macrofiles:${STAGING_DIR_NATIVE}/usr/lib/rpm/macros:${WORKDIR}/macros' > ${WORKDIR}/rpmrc + echo '%_topdir ${RPMBUILDPATH}' > ${WORKDIR}/macros + echo '%_repackage_dir ${WORKDIR}' >> ${WORKDIR}/macros + fi +} + python do_package_rpm () { - workdir = bb.data.getVar('WORKDIR', d) + workdir = bb.data.getVar('WORKDIR', d, 1) if not workdir: - raise bb.build.FuncFailed("WORKDIR not defined") - workdir = bb.data.expand(workdir, d) + bb.error("WORKDIR not defined, unable to package") + return - import os # path manipulations - outdir = bb.data.getVar('DEPLOY_DIR_RPM', d) + outdir = bb.data.getVar('DEPLOY_DIR_RPM', d, 1) if not outdir: - raise bb.build.FuncFailed("DEPLOY_DIR_RPM not defined") - outdir = bb.data.expand(outdir, d) + bb.error("DEPLOY_DIR_RPM not defined, unable to package") + return bb.mkdirhier(outdir) - packages = bb.data.getVar('PACKAGES', d) + packages = bb.data.getVar('PACKAGES', d, 1) if not packages: - packages = "${PN}" - bb.data.setVar('FILES', '', d) - ddir = bb.data.expand(bb.data.getVar('D', d), d) - bb.mkdirhier(ddir) - bb.data.setVar(bb.data.expand('FILES_${PN}', d), ''.join([ "./%s" % x for x in os.listdir(ddir)]), d) - packages = bb.data.expand(packages, d) + bb.debug(1, "PACKAGES not defined, nothing to package") + return + + if packages == []: + bb.debug(1, "No packages; nothing to do") + return + + # If "rpm" comes into overrides the presence of this function causes problems. + # Since we don't need it, remove it for now - hacky. + bb.data.delVar("do_package_write_rpm", d) for pkg in packages.split(): localdata = bb.data.createCopy(d) - root = "%s/install/%s" % (workdir, pkg) + pkgdest = bb.data.getVar('PKGDEST', d, 1) + root = "%s/%s" % (pkgdest, pkg) + + lf = bb.utils.lockfile(root + ".lock") bb.data.setVar('ROOT', '', localdata) bb.data.setVar('ROOT_%s' % pkg, root, localdata) - bb.data.setVar('PKG', pkg, localdata) + pkgname = bb.data.getVar('PKG_%s' % pkg, localdata, 1) + if not pkgname: + pkgname = pkg + bb.data.setVar('PKG', pkgname, localdata) overrides = bb.data.getVar('OVERRIDES', localdata) if not overrides: raise bb.build.FuncFailed('OVERRIDES not defined') overrides = bb.data.expand(overrides, localdata) - bb.data.setVar('OVERRIDES', '%s:%s' % (overrides, pkg), localdata) + bb.data.setVar('OVERRIDES', overrides + ':' + pkg, localdata) bb.data.update_data(localdata) -# stuff - root = bb.data.getVar('ROOT', localdata) - basedir = os.path.dirname(root) - pkgoutdir = outdir + + basedir = os.path.join(os.path.dirname(root)) + pkgoutdir = os.path.join(outdir, bb.data.getVar('PACKAGE_ARCH', localdata, 1)) bb.mkdirhier(pkgoutdir) bb.data.setVar('OUTSPECFILE', os.path.join(workdir, "%s.spec" % pkg), localdata) + # Save the value of RPMBUILD expanded into the new dictonary so any + # changes in the compoents that make up workdir don't break packaging + bb.data.setVar('RPMBUILD', bb.data.getVar("RPMBUILD", d, True), localdata) + bb.data.setVar('RPMBUILDPATH', bb.data.getVar("RPMBUILDPATH", d, True), localdata) bb.build.exec_func('write_specfile', localdata) - del localdata + bb.utils.unlockfile(lf) +} + +python () { + if bb.data.getVar('PACKAGES', d, True) != '' and \ + not bb.data.inherits_class('native', d) and \ + not bb.data.inherits_class('cross', d): + deps = (bb.data.getVarFlag('do_package_write_rpm', 'depends', d) or "").split() + deps.append('rpm-native:do_populate_staging') + deps.append('fakeroot-native:do_populate_staging') + bb.data.setVarFlag('do_package_write_rpm', 'depends', " ".join(deps), d) } + + +python do_package_write_rpm () { + bb.build.exec_func("read_subpackage_metadata", d) + bb.build.exec_func("rpm_prep", d) + bb.build.exec_func("do_package_rpm", d) +} + +do_package_write_rpm[dirs] = "${D}" +addtask package_write_rpm before do_package_write after do_package + |
