diff options
| -rw-r--r-- | meta/classes/package_rpm.bbclass | 546 |
1 files changed, 377 insertions, 169 deletions
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass index 7a1f8e08fd..3334c9ae6a 100644 --- a/meta/classes/package_rpm.bbclass +++ b/meta/classes/package_rpm.bbclass | |||
| @@ -2,178 +2,113 @@ inherit package | |||
| 2 | 2 | ||
| 3 | IMAGE_PKGTYPE ?= "rpm" | 3 | IMAGE_PKGTYPE ?= "rpm" |
| 4 | 4 | ||
| 5 | RPMBUILDPATH="${WORKDIR}/rpm" | 5 | RPM="${BUILD_ARCH}-${BUILD_OS}-rpm" |
| 6 | 6 | RPMBUILD="${BUILD_ARCH}-${BUILD_OS}-rpmbuild" | |
| 7 | RPMOPTS="" | ||
| 8 | RPMBUILDOPTS="--target ${TARGET_SYS} --define '_topdir ${RPMBUILDPATH}' --buildroot ${ROOT}" | ||
| 9 | RPM="${BUILD_ARCH}-${BUILD_OS}-rpm ${RPMOPTS}" | ||
| 10 | RPMBUILD="${BUILD_ARCH}-${BUILD_OS}-rpmbuild --short-circuit ${RPMBUILDOPTS}" | ||
| 11 | |||
| 12 | PKGWRITEDIRRPM = ${WORKDIR}/deploy-rpms" | ||
| 13 | |||
| 14 | python write_specfile() { | ||
| 15 | version = bb.data.getVar('PV', d, 1) | ||
| 16 | version = version.replace('-', '+') | ||
| 17 | bb.data.setVar('RPMPV', version, d) | ||
| 18 | |||
| 19 | out_vartranslate = { | ||
| 20 | "PKG": "Name", | ||
| 21 | "RPMPV": "Version", | ||
| 22 | "PR": "Release", | ||
| 23 | "DESCRIPTION": "%description", | ||
| 24 | "LICENSE": "License", | ||
| 25 | "SECTION": "Group", | ||
| 26 | "pkg_postinst": "%post", | ||
| 27 | "pkg_preinst": "%pre", | ||
| 28 | } | ||
| 29 | |||
| 30 | root = bb.data.getVar('ROOT', d) | ||
| 31 | |||
| 32 | # get %files | ||
| 33 | filesvar = bb.data.expand(bb.data.getVar('FILES', d), d) or "" | ||
| 34 | from glob import glob | ||
| 35 | files = filesvar.split() | ||
| 36 | todelete = [] | ||
| 37 | for file in files: | ||
| 38 | if file[0] == '.': | ||
| 39 | newfile = file[1:] | ||
| 40 | files[files.index(file)] = newfile | ||
| 41 | file = newfile | ||
| 42 | else: | ||
| 43 | newfile = file | ||
| 44 | realfile = os.path.join(root, './'+file) | ||
| 45 | if not glob(realfile): | ||
| 46 | todelete.append(files[files.index(newfile)]) | ||
| 47 | for r in todelete: | ||
| 48 | try: | ||
| 49 | del files[files.index(r)] | ||
| 50 | except ValueError: | ||
| 51 | pass | ||
| 52 | |||
| 53 | if not files and bb.data.getVar('ALLOW_EMPTY', d) != "1": | ||
| 54 | bb.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))) | ||
| 55 | return | ||
| 56 | |||
| 57 | # output .spec using this metadata store | ||
| 58 | try: | ||
| 59 | from __builtin__ import file | ||
| 60 | if not bb.data.getVar('OUTSPECFILE', d): | ||
| 61 | raise OSError('eek!') | ||
| 62 | specfile = file(bb.data.getVar('OUTSPECFILE', d), 'w') | ||
| 63 | except OSError: | ||
| 64 | raise bb.build.FuncFailed("unable to open spec file for writing.") | ||
| 65 | |||
| 66 | fd = specfile | ||
| 67 | for var in out_vartranslate.keys(): | ||
| 68 | if out_vartranslate[var][0] == "%": | ||
| 69 | continue | ||
| 70 | val = bb.data.getVar(var, d, 1) | ||
| 71 | if val: | ||
| 72 | fd.write("%s\t: %s\n" % (out_vartranslate[var], val)) | ||
| 73 | |||
| 74 | fd.write("AutoReqProv: no\n") | ||
| 75 | |||
| 76 | def fix_dep_versions(varname): | ||
| 77 | depends = bb.utils.explode_dep_versions(bb.data.getVar(varname, d, True) or "") | ||
| 78 | newdeps = [] | ||
| 79 | for dep in depends: | ||
| 80 | ver = depends[dep] | ||
| 81 | if dep and ver: | ||
| 82 | if '-' in ver: | ||
| 83 | subd = read_subpkgdata_dict(dep, d) | ||
| 84 | pv = subd['PV'] | ||
| 85 | reppv = pv.replace('-', '+') | ||
| 86 | ver = ver.replace(pv, reppv) | ||
| 87 | newdeps.append("%s (%s)" % (dep, ver)) | ||
| 88 | elif dep: | ||
| 89 | newdeps.append(dep) | ||
| 90 | bb.data.setVar(varname, " ".join(newdeps), d) | ||
| 91 | |||
| 92 | fix_dep_versions('RDEPENDS') | ||
| 93 | |||
| 94 | # Recommends is not supported by rpm at this time | ||
| 95 | # fix_dep_versions('RRECOMMENDS') | ||
| 96 | |||
| 97 | bb.build.exec_func("mapping_rename_hook", d) | ||
| 98 | |||
| 99 | def write_dep_field(varname, outstring): | ||
| 100 | depends = bb.utils.explode_dep_versions(bb.data.getVar(varname, d, True) or "") | ||
| 101 | for dep in depends: | ||
| 102 | ver = depends[dep] | ||
| 103 | if dep and ver: | ||
| 104 | fd.write("%s: %s %s\n" % (outstring, dep, ver)) | ||
| 105 | elif dep: | ||
| 106 | fd.write("%s: %s\n" % (outstring, dep)) | ||
| 107 | |||
| 108 | write_dep_field('RDEPENDS', 'Requires') | ||
| 109 | # write_dep_field('RRECOMMENDS', 'Recommends') | ||
| 110 | |||
| 111 | fd.write("Summary\t: .\n") | ||
| 112 | |||
| 113 | for var in out_vartranslate.keys(): | ||
| 114 | if out_vartranslate[var][0] != "%": | ||
| 115 | continue | ||
| 116 | val = bb.data.getVar(var, d) | ||
| 117 | if val: | ||
| 118 | fd.write(out_vartranslate[var] + "\n") | ||
| 119 | fd.write(val + "\n\n") | ||
| 120 | |||
| 121 | fd.write("%files\n") | ||
| 122 | for file in files: | ||
| 123 | if file[0] != '/': | ||
| 124 | fd.write('/') | ||
| 125 | fd.write("%s\n" % file) | ||
| 126 | |||
| 127 | fd.close() | ||
| 128 | |||
| 129 | # call out rpm -bb on the .spec, thereby creating an rpm | ||
| 130 | 7 | ||
| 131 | bb.note(bb.data.expand("${RPMBUILD} -bb ${OUTSPECFILE}", d)) | 8 | PKGWRITEDIRRPM = "${WORKDIR}/deploy-rpms" |
| 132 | 9 | ||
| 133 | bb.data.setVar('BUILDSPEC', "${RPMBUILD} -bb ${OUTSPECFILE}\n", d) | 10 | python package_rpm_fn () { |
| 134 | bb.data.setVarFlag('BUILDSPEC', 'func', '1', d) | 11 | bb.data.setVar('PKGFN', bb.data.getVar('PKG',d), d) |
| 135 | bb.build.exec_func('BUILDSPEC', d) | ||
| 136 | |||
| 137 | # move the rpm into the pkgoutdir | ||
| 138 | rpm = bb.data.expand('${RPMBUILDPATH}/RPMS/${TARGET_ARCH}/${PKG}-${RPMPV}-${PR}.${TARGET_ARCH}.rpm', d) | ||
| 139 | outrpm = bb.data.expand('${PKGWRITEDIRRPM}/${PACKAGE_ARCH}/${PKG}-${RPMPV}-${PR}.${TARGET_ARCH}.rpm', d) | ||
| 140 | bb.movefile(rpm, outrpm) | ||
| 141 | } | 12 | } |
| 142 | 13 | ||
| 143 | rpm_prep() { | 14 | python package_rpm_install () { |
| 144 | if [ ! -e ${WORKDIR}/rpmrc ]; then | 15 | bb.fatal("package_rpm_install not implemented!") |
| 145 | mkdir -p ${RPMBUILDPATH}/{SPECS,RPMS,SRPMS,SOURCES,BUILD} | ||
| 146 | fi | ||
| 147 | } | 16 | } |
| 148 | 17 | ||
| 149 | python do_package_rpm () { | 18 | python write_specfile () { |
| 150 | workdir = bb.data.getVar('WORKDIR', d, 1) | 19 | # We need to change '-' in a version field to '+' |
| 151 | if not workdir: | 20 | # This needs to be done BEFORE the mapping_rename_hook |
| 152 | bb.error("WORKDIR not defined, unable to package") | 21 | def translate_vers(varname, d): |
| 22 | depends = bb.data.getVar(varname, d, True) | ||
| 23 | if depends: | ||
| 24 | depends_dict = bb.utils.explode_dep_versions(depends) | ||
| 25 | newdeps_dict = {} | ||
| 26 | for dep in depends_dict: | ||
| 27 | ver = depends_dict[dep] | ||
| 28 | if dep and ver: | ||
| 29 | if '-' in ver: | ||
| 30 | subd = read_subpkgdata_dict(dep, d) | ||
| 31 | pv = subd['PV'] | ||
| 32 | reppv = pv.replace('-', '+') | ||
| 33 | ver = ver.replace(pv, reppv) | ||
| 34 | newdeps_dict[dep] = ver | ||
| 35 | depends = bb.utils.join_deps(newdeps_dict) | ||
| 36 | bb.data.setVar(varname, depends.strip(), d) | ||
| 37 | |||
| 38 | # We need to change the style the dependency from BB to RPM | ||
| 39 | # This needs to happen AFTER the mapping_rename_hook | ||
| 40 | def translate_deps(varname, d): | ||
| 41 | depends = bb.data.getVar('RPM' + varname, d, True) or bb.data.getVar(varname, d, True) or "" | ||
| 42 | depends = depends.replace('(', '') | ||
| 43 | depends = depends.replace(')', '') | ||
| 44 | bb.data.setVar('RPM' + varname, depends, d) | ||
| 45 | |||
| 46 | def walk_files(walkpath, target, conffiles): | ||
| 47 | import os | ||
| 48 | for rootpath, dirs, files in os.walk(walkpath): | ||
| 49 | path = rootpath.replace(walkpath, "") | ||
| 50 | #for dir in dirs: | ||
| 51 | # target.append("%dir " + path + "/" + dir) | ||
| 52 | for file in files: | ||
| 53 | if conffiles.count(path + "/" + file): | ||
| 54 | target.append("%config " + path + "/" + file) | ||
| 55 | else: | ||
| 56 | target.append(path + "/" + file) | ||
| 57 | |||
| 58 | packages = bb.data.getVar('PACKAGES', d, True) | ||
| 59 | if not packages or packages == '': | ||
| 60 | bb.debug(1, "No packages; nothing to do") | ||
| 153 | return | 61 | return |
| 154 | 62 | ||
| 155 | outdir = bb.data.getVar('PKGWRITEDIRRPM', d, 1) | 63 | pkgdest = bb.data.getVar('PKGDEST', d, True) |
| 156 | if not outdir: | 64 | if not pkgdest: |
| 157 | bb.error("PKGWRITEDIRRPM not defined, unable to package") | 65 | bb.fatal("No PKGDEST") |
| 158 | return | 66 | return |
| 159 | bb.mkdirhier(outdir) | ||
| 160 | 67 | ||
| 161 | packages = bb.data.getVar('PACKAGES', d, 1) | 68 | outspecfile = bb.data.getVar('OUTSPECFILE', d, True) |
| 162 | if not packages: | 69 | if not outspecfile: |
| 163 | bb.debug(1, "PACKAGES not defined, nothing to package") | 70 | bb.fatal("No OUTSPECFILE") |
| 164 | return | 71 | return |
| 165 | 72 | ||
| 166 | if packages == []: | 73 | # Construct the SPEC file... |
| 167 | bb.debug(1, "No packages; nothing to do") | 74 | srcname = bb.data.getVar('PN', d, True) |
| 168 | return | 75 | srcsummary = (bb.data.getVar('SUMMARY', d, True) or ".") |
| 169 | 76 | srcversion = bb.data.getVar('PV', d, True).replace('-', '+') | |
| 170 | # If "rpm" comes into overrides the presence of this function causes problems. | 77 | srcrelease = bb.data.getVar('PR', d, True) |
| 171 | # Since we don't need it, remove it for now - hacky. | 78 | srcepoch = (bb.data.getVar('PE', d, True) or "") |
| 172 | bb.data.delVar("do_package_write_rpm", d) | 79 | srclicense = bb.data.getVar('LICENSE', d, True) |
| 80 | srcsection = bb.data.getVar('SECTION', d, True) | ||
| 81 | srcmaintainer = bb.data.getVar('MAINTAINER', d, True) | ||
| 82 | srchomepage = bb.data.getVar('HOMEPAGE', d, True) | ||
| 83 | srcdescription = bb.data.getVar('DESCRIPTION', d, True) | ||
| 84 | |||
| 85 | translate_deps('DEPENDS', d) | ||
| 86 | srcdepends = bb.data.getVar('RPMDEPENDS', d, True) | ||
| 87 | srcrdepends = [] | ||
| 88 | srcrrecommends = [] | ||
| 89 | srcrsuggests = [] | ||
| 90 | srcrprovides = [] | ||
| 91 | srcrreplaces = [] | ||
| 92 | srcrconflicts = [] | ||
| 93 | srcrobsoletes = [] | ||
| 94 | |||
| 95 | srcpreinst = [] | ||
| 96 | srcpostinst = [] | ||
| 97 | srcprerm = [] | ||
| 98 | srcpostrm = [] | ||
| 99 | |||
| 100 | spec_preamble_top = [] | ||
| 101 | spec_preamble_bottom = [] | ||
| 102 | |||
| 103 | spec_scriptlets_top = [] | ||
| 104 | spec_scriptlets_bottom = [] | ||
| 105 | |||
| 106 | spec_files_top = [] | ||
| 107 | spec_files_bottom = [] | ||
| 173 | 108 | ||
| 174 | for pkg in packages.split(): | 109 | for pkg in packages.split(): |
| 175 | localdata = bb.data.createCopy(d) | 110 | localdata = bb.data.createCopy(d) |
| 176 | pkgdest = bb.data.getVar('PKGDEST', d, 1) | 111 | |
| 177 | root = "%s/%s" % (pkgdest, pkg) | 112 | root = "%s/%s" % (pkgdest, pkg) |
| 178 | 113 | ||
| 179 | lf = bb.utils.lockfile(root + ".lock") | 114 | lf = bb.utils.lockfile(root + ".lock") |
| @@ -188,16 +123,289 @@ python do_package_rpm () { | |||
| 188 | bb.data.setVar('OVERRIDES', pkg, localdata) | 123 | bb.data.setVar('OVERRIDES', pkg, localdata) |
| 189 | 124 | ||
| 190 | bb.data.update_data(localdata) | 125 | bb.data.update_data(localdata) |
| 191 | basedir = os.path.join(os.path.dirname(root)) | 126 | |
| 192 | pkgoutdir = os.path.join(outdir, bb.data.getVar('PACKAGE_ARCH', localdata, 1)) | 127 | conffiles = (bb.data.getVar('CONFFILES', localdata, True) or "").split() |
| 193 | bb.mkdirhier(pkgoutdir) | 128 | |
| 194 | bb.data.setVar('OUTSPECFILE', os.path.join(workdir, "%s.spec" % pkg), localdata) | 129 | splitname = pkgname |
| 195 | # Save the value of RPMBUILD expanded into the new dictonary so any | 130 | |
| 196 | # changes in the compoents that make up workdir don't break packaging | 131 | splitsummary = (bb.data.getVar('SUMMARY', d, True) or ".") |
| 197 | bb.data.setVar('RPMBUILD', bb.data.getVar("RPMBUILD", d, True), localdata) | 132 | splitversion = (bb.data.getVar('PV', localdata, True) or "").replace('-', '+') |
| 198 | bb.data.setVar('RPMBUILDPATH', bb.data.getVar("RPMBUILDPATH", d, True), localdata) | 133 | splitrelease = (bb.data.getVar('PR', localdata, True) or "") |
| 199 | bb.build.exec_func('write_specfile', localdata) | 134 | splitepoch = (bb.data.getVar('PE', localdata, True) or "") |
| 135 | splitlicense = (bb.data.getVar('LICENSE', localdata, True) or "") | ||
| 136 | splitsection = (bb.data.getVar('SECTION', localdata, True) or "") | ||
| 137 | splitdescription = (bb.data.getVar('DESCRIPTION', localdata, True) or "") | ||
| 138 | |||
| 139 | translate_vers('RDEPENDS', localdata) | ||
| 140 | translate_vers('RRECOMMENDS', localdata) | ||
| 141 | translate_vers('RSUGGESTS', localdata) | ||
| 142 | translate_vers('RPROVIDES', localdata) | ||
| 143 | translate_vers('RREPLACES', localdata) | ||
| 144 | translate_vers('RCONFLICTS', localdata) | ||
| 145 | |||
| 146 | # Map the dependencies into their final form | ||
| 147 | bb.build.exec_func("mapping_rename_hook", localdata) | ||
| 148 | |||
| 149 | translate_deps('RDEPENDS', localdata) | ||
| 150 | translate_deps('RRECOMMENDS', localdata) | ||
| 151 | translate_deps('RSUGGESTS', localdata) | ||
| 152 | translate_deps('RPROVIDES', localdata) | ||
| 153 | translate_deps('RREPLACES', localdata) | ||
| 154 | translate_deps('RCONFLICTS', localdata) | ||
| 155 | |||
| 156 | splitrdepends = bb.data.getVar('RPMRDEPENDS', localdata, True) | ||
| 157 | splitrrecommends = bb.data.getVar('RPMRRECOMMENDS', localdata, True) | ||
| 158 | splitrsuggests = bb.data.getVar('RPMRSUGGESTS', localdata, True) | ||
| 159 | splitrprovides = bb.data.getVar('RPMRPROVIDES', localdata, True) | ||
| 160 | splitrreplaces = bb.data.getVar('RPMRREPLACES', localdata, True) | ||
| 161 | splitrconflicts = bb.data.getVar('RPMRCONFLICTS', localdata, True) | ||
| 162 | splitrobsoletes = [] | ||
| 163 | |||
| 164 | # Gather special src/first package data | ||
| 165 | if srcname == splitname: | ||
| 166 | srcrdepends = splitrdepends | ||
| 167 | srcrrecommends = splitrrecommends | ||
| 168 | srcrsuggests = splitrsuggests | ||
| 169 | srcrprovides = splitrprovides | ||
| 170 | srcrreplaces = splitrreplaces | ||
| 171 | srcrconflicts = splitrconflicts | ||
| 172 | |||
| 173 | srcpreinst = bb.data.getVar('pkg_preinst', localdata, True) | ||
| 174 | srcpostinst = bb.data.getVar('pkg_postinst', localdata, True) | ||
| 175 | srcprerm = bb.data.getVar('pkg_prerm', localdata, True) | ||
| 176 | srcpostrm = bb.data.getVar('pkg_postrm', localdata, True) | ||
| 177 | |||
| 178 | file_list = [] | ||
| 179 | walk_files(root, file_list, conffiles) | ||
| 180 | if not file_list and bb.data.getVar('ALLOW_EMPTY', localdata) != "1": | ||
| 181 | bb.note("Not creating empty RPM package for %s" % splitname) | ||
| 182 | else: | ||
| 183 | bb.note("Creating RPM package for %s" % splitname) | ||
| 184 | spec_files_top.append('%files') | ||
| 185 | if file_list: | ||
| 186 | spec_files_top.extend(file_list) | ||
| 187 | spec_files_top.append('') | ||
| 188 | |||
| 189 | bb.utils.unlockfile(lf) | ||
| 190 | continue | ||
| 191 | |||
| 192 | # Process subpackage data | ||
| 193 | spec_preamble_bottom.append('%%package -n %s' % splitname) | ||
| 194 | spec_preamble_bottom.append('Summary: %s' % splitsummary) | ||
| 195 | if srcversion != splitversion: | ||
| 196 | spec_preamble_bottom.append('Version: %s' % splitversion) | ||
| 197 | if srcrelease != splitrelease: | ||
| 198 | spec_preamble_bottom.append('Release: %s' % splitrelease) | ||
| 199 | if srcepoch != splitepoch: | ||
| 200 | spec_preamble_bottom.append('Epoch: %s' % splitepoch) | ||
| 201 | if srclicense != splitlicense: | ||
| 202 | spec_preamble_bottom.append('License: %s' % splitlicense) | ||
| 203 | spec_preamble_bottom.append('Group: %s' % splitsection) | ||
| 204 | |||
| 205 | # Replaces == Obsoletes && Provides | ||
| 206 | if splitrreplaces and splitrreplaces.strip() != "": | ||
| 207 | for dep in splitrreplaces.split(','): | ||
| 208 | if splitrprovides: | ||
| 209 | splitrprovides = splitrprovides + ", " + dep | ||
| 210 | else: | ||
| 211 | splitrprovides = dep | ||
| 212 | if splitrobsoletes: | ||
| 213 | splitrobsoletes = splitrobsoletes + ", " + dep | ||
| 214 | else: | ||
| 215 | splitrobsoletes = dep | ||
| 216 | |||
| 217 | if splitrdepends and splitrdepends.strip() != "": | ||
| 218 | spec_preamble_bottom.append('Requires: %s' % splitrdepends) | ||
| 219 | #if splitrrecommends and splitrrecommends.strip() != "": | ||
| 220 | # spec_preamble_bottom.append('#Recommends: %s' % splitrrecommends) | ||
| 221 | #if splitrsuggests and splitrsuggests.strip() != "": | ||
| 222 | # spec_preamble_bottom.append('#Suggests: %s' % splitrsuggests) | ||
| 223 | if splitrprovides and splitrprovides.strip() != "": | ||
| 224 | spec_preamble_bottom.append('Provides: %s' % splitrprovides) | ||
| 225 | if splitrobsoletes and splitrobsoletes.strip() != "": | ||
| 226 | spec_preamble_bottom.append('Obsoletes: %s' % splitrobsoletes) | ||
| 227 | if splitrconflicts and splitrconflicts.strip() != "": | ||
| 228 | for dep in splitrconflicts.split(','): | ||
| 229 | # A conflict can NOT be in the provide or an internal conflict happens! | ||
| 230 | if dep not in splitrprovides: | ||
| 231 | spec_preamble_bottom.append('Conflicts: %s' % dep) | ||
| 232 | |||
| 233 | spec_preamble_bottom.append('') | ||
| 234 | |||
| 235 | spec_preamble_bottom.append('%%description -n %s' % splitname) | ||
| 236 | spec_preamble_bottom.append('%s' % splitdescription) | ||
| 237 | |||
| 238 | spec_preamble_bottom.append('') | ||
| 239 | |||
| 240 | # Now process scriptlets | ||
| 241 | for script in ["preinst", "postinst", "prerm", "postrm"]: | ||
| 242 | scriptvar = bb.data.getVar('pkg_%s' % script, localdata, True) | ||
| 243 | if not scriptvar: | ||
| 244 | continue | ||
| 245 | if script == 'preinst': | ||
| 246 | spec_scriptlets_bottom.append('%%pre -n %s' % splitname) | ||
| 247 | elif script == 'postinst': | ||
| 248 | spec_scriptlets_bottom.append('%%post -n %s' % splitname) | ||
| 249 | elif script == 'prerm': | ||
| 250 | spec_scriptlets_bottom.append('%%preun -n %s' % splitname) | ||
| 251 | elif script == 'postrm': | ||
| 252 | spec_scriptlets_bottom.append('%%postun -n %s' % splitname) | ||
| 253 | spec_scriptlets_bottom.append(scriptvar) | ||
| 254 | spec_scriptlets_bottom.append('') | ||
| 255 | |||
| 256 | # Now process files | ||
| 257 | file_list = [] | ||
| 258 | walk_files(root, file_list, conffiles) | ||
| 259 | if not file_list and bb.data.getVar('ALLOW_EMPTY', localdata) != "1": | ||
| 260 | bb.note("Not creating empty RPM package for %s" % splitname) | ||
| 261 | else: | ||
| 262 | bb.note("Creating RPM package for %s" % splitname) | ||
| 263 | spec_files_bottom.append('%%files -n %s' % splitname) | ||
| 264 | if file_list: | ||
| 265 | spec_files_bottom.extend(file_list) | ||
| 266 | spec_files_bottom.append('') | ||
| 267 | |||
| 268 | del localdata | ||
| 200 | bb.utils.unlockfile(lf) | 269 | bb.utils.unlockfile(lf) |
| 270 | |||
| 271 | spec_preamble_top.append('Summary: %s' % srcsummary) | ||
| 272 | spec_preamble_top.append('Name: %s' % srcname) | ||
| 273 | spec_preamble_top.append('Version: %s' % srcversion) | ||
| 274 | spec_preamble_top.append('Release: %s' % srcrelease) | ||
| 275 | if srcepoch and srcepoch.strip() != "": | ||
| 276 | spec_preamble_top.append('Epoch: %s' % srcepoch) | ||
| 277 | spec_preamble_top.append('License: %s' % srclicense) | ||
| 278 | spec_preamble_top.append('Group: %s' % srcsection) | ||
| 279 | spec_preamble_top.append('Packager: %s' % srcmaintainer) | ||
| 280 | spec_preamble_top.append('URL: %s' % srchomepage) | ||
| 281 | |||
| 282 | # Replaces == Obsoletes && Provides | ||
| 283 | if srcrreplaces and srcrreplaces.strip() != "": | ||
| 284 | for dep in srcrreplaces.split(','): | ||
| 285 | if srcrprovides: | ||
| 286 | srcrprovides = srcrprovides + ", " + dep | ||
| 287 | else: | ||
| 288 | srcrprovides = dep | ||
| 289 | if srcrobsoletes: | ||
| 290 | srcrobsoletes = srcrobsoletes + ", " + dep | ||
| 291 | else: | ||
| 292 | srcrobsoletes = dep | ||
| 293 | if srcdepends and srcdepends.strip() != "": | ||
| 294 | spec_preamble_top.append('BuildRequires: %s' % srcdepends) | ||
| 295 | if srcrdepends and srcrdepends.strip() != "": | ||
| 296 | spec_preamble_top.append('Requires: %s' % srcrdepends) | ||
| 297 | #if srcrrecommends and srcrrecommends.strip() != "": | ||
| 298 | # spec_preamble_top.append('#Recommends: %s' % srcrrecommends) | ||
| 299 | #if srcrsuggests and srcrsuggests.strip() != "": | ||
| 300 | # spec_preamble_top.append('#Suggests: %s' % srcrsuggests) | ||
| 301 | if srcrprovides and srcrprovides.strip() != "": | ||
| 302 | spec_preamble_top.append('Provides: %s' % srcrprovides) | ||
| 303 | if srcrobsoletes and srcrobsoletes.strip() != "": | ||
| 304 | spec_preamble_top.append('Obsoletes: %s' % srcrobsoletes) | ||
| 305 | if srcrconflicts and srcrconflicts.strip() != "": | ||
| 306 | for dep in srcrconflicts.split(','): | ||
| 307 | # A conflict can NOT be in the provide or an internal conflict happens! | ||
| 308 | if dep not in srcrprovides: | ||
| 309 | spec_preamble_bottom.append('Conflicts: %s' % dep) | ||
| 310 | |||
| 311 | spec_preamble_top.append('') | ||
| 312 | |||
| 313 | spec_preamble_top.append('%description') | ||
| 314 | spec_preamble_top.append('%s' % srcdescription) | ||
| 315 | |||
| 316 | spec_preamble_top.append('') | ||
| 317 | |||
| 318 | if srcpreinst: | ||
| 319 | spec_scriptlets_top.append('%pre') | ||
| 320 | spec_scriptlets_top.append(srcpreinst) | ||
| 321 | spec_scriptlets_top.append('') | ||
| 322 | if srcpostinst: | ||
| 323 | spec_scriptlets_top.append('%post') | ||
| 324 | spec_scriptlets_top.append(srcpostinst) | ||
| 325 | spec_scriptlets_top.append('') | ||
| 326 | if srcprerm: | ||
| 327 | spec_scriptlets_top.append('%preun') | ||
| 328 | spec_scriptlets_top.append(srcprerm) | ||
| 329 | spec_scriptlets_top.append('') | ||
| 330 | if srcpostrm: | ||
| 331 | spec_scriptlets_top.append('%postun') | ||
| 332 | spec_scriptlets_top.append(srcpostrm) | ||
| 333 | spec_scriptlets_top.append('') | ||
| 334 | |||
| 335 | # Write the SPEC file | ||
| 336 | try: | ||
| 337 | from __builtin__ import file | ||
| 338 | specfile = file(outspecfile, 'w') | ||
| 339 | except OSError: | ||
| 340 | raise bb.build.FuncFailed("unable to open spec file for writing.") | ||
| 341 | |||
| 342 | for line in spec_preamble_top: | ||
| 343 | specfile.write(line + "\n") | ||
| 344 | |||
| 345 | for line in spec_preamble_bottom: | ||
| 346 | specfile.write(line + "\n") | ||
| 347 | |||
| 348 | for line in spec_scriptlets_top: | ||
| 349 | specfile.write(line + "\n") | ||
| 350 | |||
| 351 | for line in spec_scriptlets_bottom: | ||
| 352 | specfile.write(line + "\n") | ||
| 353 | |||
| 354 | for line in spec_files_top: | ||
| 355 | specfile.write(line + "\n") | ||
| 356 | |||
| 357 | for line in spec_files_bottom: | ||
| 358 | specfile.write(line + "\n") | ||
| 359 | |||
| 360 | specfile.close() | ||
| 361 | } | ||
| 362 | |||
| 363 | python do_package_rpm () { | ||
| 364 | import os | ||
| 365 | |||
| 366 | workdir = bb.data.getVar('WORKDIR', d, True) | ||
| 367 | outdir = bb.data.getVar('DEPLOY_DIR_IPK', d, True) | ||
| 368 | dvar = bb.data.getVar('D', d, True) | ||
| 369 | tmpdir = bb.data.getVar('TMPDIR', d, True) | ||
| 370 | pkgd = bb.data.getVar('PKGD', d, True) | ||
| 371 | pkgdest = bb.data.getVar('PKGDEST', d, True) | ||
| 372 | if not workdir or not outdir or not dvar or not tmpdir: | ||
| 373 | bb.error("Variables incorrectly set, unable to package") | ||
| 374 | return | ||
| 375 | |||
| 376 | if not os.path.exists(dvar): | ||
| 377 | bb.debug(1, "Nothing installed, nothing to do") | ||
| 378 | return | ||
| 379 | |||
| 380 | packages = bb.data.getVar('PACKAGES', d, True) | ||
| 381 | if not packages or packages == '': | ||
| 382 | bb.debug(1, "No packages; nothing to do") | ||
| 383 | return | ||
| 384 | |||
| 385 | # Construct the spec file... | ||
| 386 | srcname = bb.data.getVar('PN', d, True) | ||
| 387 | outspecfile = workdir + "/" + srcname + ".spec" | ||
| 388 | bb.data.setVar('OUTSPECFILE', outspecfile, d) | ||
| 389 | bb.build.exec_func('write_specfile', d) | ||
| 390 | |||
| 391 | # Setup the rpmbuild arguments... | ||
| 392 | rpmbuild = bb.data.getVar('RPMBUILD', d, True) | ||
| 393 | targetsys = bb.data.getVar('TARGET_SYS', d, True) | ||
| 394 | pkgwritedir = bb.data.expand('${PKGWRITEDIRRPM}/${PACKAGE_ARCH}', d) | ||
| 395 | pkgarch = bb.data.expand('${PACKAGE_ARCH}', d) | ||
| 396 | bb.mkdirhier(pkgwritedir) | ||
| 397 | os.chmod(pkgwritedir, 0755) | ||
| 398 | |||
| 399 | cmd = rpmbuild | ||
| 400 | cmd = cmd + " --nodeps --short-circuit --target " + pkgarch + " --buildroot " + pkgd | ||
| 401 | cmd = cmd + " --define '_topdir " + workdir + "' --define '_rpmdir " + pkgwritedir + "'" | ||
| 402 | cmd = cmd + " --define '_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm'" | ||
| 403 | cmd = cmd + " -bb " + outspecfile | ||
| 404 | |||
| 405 | # Build the spec file! | ||
| 406 | bb.data.setVar('BUILDSPEC', cmd + "\n", d) | ||
| 407 | bb.data.setVarFlag('BUILDSPEC', 'func', '1', d) | ||
| 408 | bb.build.exec_func('BUILDSPEC', d) | ||
| 201 | } | 409 | } |
| 202 | 410 | ||
| 203 | python () { | 411 | python () { |
| @@ -206,7 +414,7 @@ python () { | |||
| 206 | deps.append('rpm-native:do_populate_sysroot') | 414 | deps.append('rpm-native:do_populate_sysroot') |
| 207 | deps.append('virtual/fakeroot-native:do_populate_sysroot') | 415 | deps.append('virtual/fakeroot-native:do_populate_sysroot') |
| 208 | bb.data.setVarFlag('do_package_write_rpm', 'depends', " ".join(deps), d) | 416 | bb.data.setVarFlag('do_package_write_rpm', 'depends', " ".join(deps), d) |
| 209 | bb.data.setVarFlag('do_package_write_ipk', 'fakeroot', "1", d) | 417 | bb.data.setVarFlag('do_package_write_rpm', 'fakeroot', 1, d) |
| 210 | } | 418 | } |
| 211 | 419 | ||
| 212 | SSTATETASKS += "do_package_write_rpm" | 420 | SSTATETASKS += "do_package_write_rpm" |
| @@ -215,15 +423,15 @@ do_package_write_rpm[sstate-inputdirs] = "${PKGWRITEDIRRPM}" | |||
| 215 | do_package_write_rpm[sstate-outputdirs] = "${DEPLOY_DIR_RPM}" | 423 | do_package_write_rpm[sstate-outputdirs] = "${DEPLOY_DIR_RPM}" |
| 216 | 424 | ||
| 217 | python do_package_write_rpm_setscene () { | 425 | python do_package_write_rpm_setscene () { |
| 218 | sstate_setscene(d) | 426 | sstate_setscene(d) |
| 219 | } | 427 | } |
| 220 | #addtask do_package_write_rpm_setscene | 428 | #addtask do_package_write_rpm_setscene |
| 221 | 429 | ||
| 222 | python do_package_write_rpm () { | 430 | python do_package_write_rpm () { |
| 223 | bb.build.exec_func("read_subpackage_metadata", d) | 431 | bb.build.exec_func("read_subpackage_metadata", d) |
| 224 | bb.build.exec_func("rpm_prep", d) | ||
| 225 | bb.build.exec_func("do_package_rpm", d) | 432 | bb.build.exec_func("do_package_rpm", d) |
| 226 | } | 433 | } |
| 434 | |||
| 227 | do_package_write_rpm[dirs] = "${PKGWRITEDIRRPM}" | 435 | do_package_write_rpm[dirs] = "${PKGWRITEDIRRPM}" |
| 228 | addtask package_write_rpm before do_package_write after do_package | 436 | addtask package_write_rpm before do_package_write after do_package |
| 229 | 437 | ||
