diff options
Diffstat (limited to 'meta/classes-global/package_rpm.bbclass')
-rw-r--r-- | meta/classes-global/package_rpm.bbclass | 126 |
1 files changed, 71 insertions, 55 deletions
diff --git a/meta/classes-global/package_rpm.bbclass b/meta/classes-global/package_rpm.bbclass index 81a2060b68..790ccbfaf0 100644 --- a/meta/classes-global/package_rpm.bbclass +++ b/meta/classes-global/package_rpm.bbclass @@ -8,12 +8,13 @@ inherit package IMAGE_PKGTYPE ?= "rpm" -RPM="rpm" -RPMBUILD="rpmbuild" +RPM = "rpm" +RPMBUILD = "rpmbuild" +RPMBUILD_COMPMODE ?= "${@'w19T%d.zstdio' % int(d.getVar('ZSTD_THREADS'))}" PKGWRITEDIRRPM = "${WORKDIR}/deploy-rpms" -# Maintaining the perfile dependencies has singificant overhead when writing the +# Maintaining the perfile dependencies has significant overhead when writing the # packages. When set, this value merges them for efficiency. MERGEPERFILEDEPS = "1" @@ -62,8 +63,8 @@ def write_rpm_perfiledata(srcname, d): for dep in depends_dict: ver = depends_dict[dep] if dep and ver: - ver = ver.replace("(","") - ver = ver.replace(")","") + ver = ver.replace("(", "") + ver = ver.replace(")", "") outfile.write(dep + " " + ver + " ") else: outfile.write(dep + " ") @@ -102,11 +103,12 @@ def write_rpm_perfiledata(srcname, d): python write_specfile () { import oe.packagedata + import os,pwd,grp,stat # append information for logs and patches to %prep - def add_prep(d,spec_files_bottom): + def add_prep(d, spec_files_bottom): if d.getVarFlag('ARCHIVER_MODE', 'srpm') == '1' and bb.data.inherits_class('archiver', d): - spec_files_bottom.append('%%prep -n %s' % d.getVar('PN') ) + spec_files_bottom.append('%%prep -n %s' % d.getVar('PN')) spec_files_bottom.append('%s' % "echo \"include logs and patches, Please check them in SOURCES\"") spec_files_bottom.append('') @@ -119,7 +121,7 @@ python write_specfile () { source_list = os.listdir(ar_outdir) source_number = 0 for source in source_list: - # do_deploy_archives may have already run (from sstate) meaning a .src.rpm may already + # do_deploy_archives may have already run (from sstate) meaning a .src.rpm may already # exist in ARCHIVER_OUTDIR so skip if present. if source.endswith(".src.rpm"): continue @@ -159,7 +161,9 @@ python write_specfile () { pv = subd['PV'] pkgv = subd['PKGV'] reppv = pkgv.replace('-', '+') - ver = ver.replace(pv, reppv).replace(pkgv, reppv) + if ver.startswith(pv): + ver = ver.replace(pv, reppv) + ver = ver.replace(pkgv, reppv) if 'PKGR' in subd: # Make sure PKGR rather than PR in ver pr = '-' + subd['PR'] @@ -187,18 +191,37 @@ python write_specfile () { if not len(depends_dict[dep]): array.append("%s: %s" % (tag, dep)) - def walk_files(walkpath, target, conffiles, dirfiles): + def walk_files(walkpath, target, conffiles): # We can race against the ipk/deb backends which create CONTROL or DEBIAN directories - # when packaging. We just ignore these files which are created in + # when packaging. We just ignore these files which are created in # packages-split/ and not package/ # We have the odd situation where the CONTROL/DEBIAN directory can be removed in the middle of # of the walk, the isdir() test would then fail and the walk code would assume its a file # hence we check for the names in files too. for rootpath, dirs, files in os.walk(walkpath): + def get_attr(path): + stat_f = os.stat(rootpath + "/" + path, follow_symlinks=False) + mode = stat.S_IMODE(stat_f.st_mode) + try: + owner = pwd.getpwuid(stat_f.st_uid).pw_name + except Exception as e: + bb.error("Content of /etc/passwd in sysroot:\n{}".format( + open(d.getVar("RECIPE_SYSROOT") +"/etc/passwd").read())) + raise e + try: + group = grp.getgrgid(stat_f.st_gid).gr_name + except Exception as e: + bb.error("Content of /etc/group in sysroot:\n{}".format( + open(d.getVar("RECIPE_SYSROOT") +"/etc/group").read())) + raise e + return "%attr({:o},{},{}) ".format(mode, owner, group) + + def escape_chars(p): + return p.replace("%", "%%").replace("\\", "\\\\").replace('"', '\\"') + path = rootpath.replace(walkpath, "") if path.endswith("DEBIAN") or path.endswith("CONTROL"): continue - path = path.replace("%", "%%%%%%%%") # Treat all symlinks to directories as normal files. # os.walk() lists them as directories. @@ -210,32 +233,22 @@ python write_specfile () { return False dirs[:] = [dir for dir in dirs if not move_to_files(dir)] - # Directory handling can happen in two ways, either DIRFILES is not set at all - # in which case we fall back to the older behaviour of packages owning all their - # directories - if dirfiles is None: - for dir in dirs: - if dir == "CONTROL" or dir == "DEBIAN": - continue - dir = dir.replace("%", "%%%%%%%%") - # All packages own the directories their files are in... - target.append('%dir "' + path + '/' + dir + '"') - else: - # packages own only empty directories or explict directory. - # This will prevent the overlapping of security permission. - if path and not files and not dirs: - target.append('%dir "' + path + '"') - elif path and path in dirfiles: - target.append('%dir "' + path + '"') + for dir in dirs: + if dir == "CONTROL" or dir == "DEBIAN": + continue + p = path + '/' + dir + # All packages own the directories their files are in... + target.append(get_attr(dir) + '%dir "' + escape_chars(p) + '"') for file in files: if file == "CONTROL" or file == "DEBIAN": continue - file = file.replace("%", "%%%%%%%%") - if conffiles.count(path + '/' + file): - target.append('%config "' + path + '/' + file + '"') + attr = get_attr(file) + p = path + '/' + file + if conffiles.count(p): + target.append(attr + '%config "' + escape_chars(p) + '"') else: - target.append('"' + path + '/' + file + '"') + target.append(attr + '"' + escape_chars(p) + '"') # Prevent the prerm/postrm scripts from being run during an upgrade def wrap_uninstall(scriptvar): @@ -297,7 +310,7 @@ python write_specfile () { srcmaintainer = localdata.getVar('MAINTAINER') srchomepage = localdata.getVar('HOMEPAGE') srcdescription = localdata.getVar('DESCRIPTION') or "." - srccustomtagschunk = get_package_additional_metadata("rpm", localdata) + srccustomtagschunk = oe.packagedata.get_package_additional_metadata("rpm", localdata) srcdepends = d.getVar('DEPENDS') srcrdepends = "" @@ -339,10 +352,7 @@ python write_specfile () { localdata.setVar('OVERRIDES', d.getVar("OVERRIDES", False) + ":" + pkg) - conffiles = get_conffiles(pkg, d) - dirfiles = localdata.getVar('DIRFILES') - if dirfiles is not None: - dirfiles = dirfiles.split() + conffiles = oe.package.get_conffiles(pkg, d) splitname = pkgname @@ -353,7 +363,7 @@ python write_specfile () { splitlicense = (localdata.getVar('LICENSE') or "") splitsection = (localdata.getVar('SECTION') or "") splitdescription = (localdata.getVar('DESCRIPTION') or ".") - splitcustomtagschunk = get_package_additional_metadata("rpm", localdata) + splitcustomtagschunk = oe.packagedata.get_package_additional_metadata("rpm", localdata) translate_vers('RDEPENDS', localdata) translate_vers('RRECOMMENDS', localdata) @@ -363,7 +373,7 @@ python write_specfile () { translate_vers('RCONFLICTS', localdata) # Map the dependencies into their final form - mapping_rename_hook(localdata) + oe.packagedata.mapping_rename_hook(localdata) splitrdepends = localdata.getVar('RDEPENDS') or "" splitrrecommends = localdata.getVar('RRECOMMENDS') or "" @@ -407,7 +417,7 @@ python write_specfile () { srcrpostrm = splitrpostrm file_list = [] - walk_files(root, file_list, conffiles, dirfiles) + walk_files(root, file_list, conffiles) if not file_list and localdata.getVar('ALLOW_EMPTY', False) != "1": bb.note("Not creating empty RPM package for %s" % splitname) else: @@ -443,9 +453,9 @@ python write_specfile () { rprovides = bb.utils.explode_dep_versions2(splitrprovides) rreplaces = bb.utils.explode_dep_versions2(splitrreplaces) for dep in rreplaces: - if not dep in robsoletes: + if dep not in robsoletes: robsoletes[dep] = rreplaces[dep] - if not dep in rprovides: + if dep not in rprovides: rprovides[dep] = rreplaces[dep] splitrobsoletes = bb.utils.join_deps(robsoletes, commasep=False) splitrprovides = bb.utils.join_deps(rprovides, commasep=False) @@ -499,7 +509,7 @@ python write_specfile () { # Now process files file_list = [] - walk_files(root, file_list, conffiles, dirfiles) + walk_files(root, file_list, conffiles) if not file_list and localdata.getVar('ALLOW_EMPTY', False) != "1": bb.note("Not creating empty RPM package for %s" % splitname) else: @@ -515,8 +525,8 @@ python write_specfile () { spec_files_bottom.append('') del localdata - - add_prep(d,spec_files_bottom) + + add_prep(d, spec_files_bottom) spec_preamble_top.append('Summary: %s' % srcsummary) spec_preamble_top.append('Name: %s' % srcname) spec_preamble_top.append('Version: %s' % srcversion) @@ -537,9 +547,9 @@ python write_specfile () { rprovides = bb.utils.explode_dep_versions2(srcrprovides) rreplaces = bb.utils.explode_dep_versions2(srcrreplaces) for dep in rreplaces: - if not dep in robsoletes: + if dep not in robsoletes: robsoletes[dep] = rreplaces[dep] - if not dep in rprovides: + if dep not in rprovides: rprovides[dep] = rreplaces[dep] srcrobsoletes = bb.utils.join_deps(robsoletes, commasep=False) srcrprovides = bb.utils.join_deps(rprovides, commasep=False) @@ -631,7 +641,6 @@ python do_package_rpm () { workdir = d.getVar('WORKDIR') tmpdir = d.getVar('TMPDIR') pkgd = d.getVar('PKGD') - pkgdest = d.getVar('PKGDEST') if not workdir or not pkgd or not tmpdir: bb.error("Variables incorrectly set, unable to package") return @@ -642,7 +651,7 @@ python do_package_rpm () { return # Construct the spec file... - # If the spec file already exist, and has not been stored into + # If the spec file already exist, and has not been stored into # pseudo's files.db, it maybe cause rpmbuild src.rpm fail, # so remove it before doing rpmbuild src.rpm. srcname = d.getVar('PN') @@ -658,8 +667,8 @@ python do_package_rpm () { # Setup the rpmbuild arguments... rpmbuild = d.getVar('RPMBUILD') - targetsys = d.getVar('TARGET_SYS') - targetvendor = d.getVar('HOST_VENDOR') + rpmbuild_compmode = d.getVar('RPMBUILD_COMPMODE') + rpmbuild_extra_params = d.getVar('RPMBUILD_EXTRA_PARAMS') or "" # Too many places in dnf stack assume that arch-independent packages are "noarch". # Let's not fight against this. @@ -667,7 +676,6 @@ python do_package_rpm () { if package_arch == "all": package_arch = "noarch" - sdkpkgsuffix = (d.getVar('SDKPKGSUFFIX') or "nativesdk").replace("-", "_") d.setVar('PACKAGE_ARCH_EXTEND', package_arch) pkgwritedir = d.expand('${PKGWRITEDIRRPM}/${PACKAGE_ARCH_EXTEND}') d.setVar('RPM_PKGWRITEDIR', pkgwritedir) @@ -684,8 +692,8 @@ python do_package_rpm () { cmd = cmd + " --define '_use_internal_dependency_generator 0'" cmd = cmd + " --define '_binaries_in_noarch_packages_terminate_build 0'" cmd = cmd + " --define '_build_id_links none'" - cmd = cmd + " --define '_binary_payload w19T%d.zstdio'" % int(d.getVar("ZSTD_THREADS")) - cmd = cmd + " --define '_source_payload w19T%d.zstdio'" % int(d.getVar("ZSTD_THREADS")) + cmd = cmd + " --define '_source_payload %s'" % rpmbuild_compmode + cmd = cmd + " --define '_binary_payload %s'" % rpmbuild_compmode cmd = cmd + " --define 'clamp_mtime_to_source_date_epoch 1'" cmd = cmd + " --define 'use_source_date_epoch_as_buildtime 1'" cmd = cmd + " --define '_buildhost reproducible'" @@ -699,6 +707,10 @@ python do_package_rpm () { cmd = cmd + " --define '_unpackaged_files_terminate_build 0'" cmd = cmd + " --define 'debug_package %{nil}'" cmd = cmd + " --define '_tmppath " + workdir + "'" + cmd = cmd + " --define '_use_weak_usergroup_deps 1'" + cmd = cmd + " --define '_passwd_path " + "/completely/bogus/path" + "'" + cmd = cmd + " --define '_group_path " + "/completely/bogus/path" + "'" + cmd = cmd + rpmbuild_extra_params if d.getVarFlag('ARCHIVER_MODE', 'srpm') == '1' and bb.data.inherits_class('archiver', d): cmd = cmd + " --define '_sourcedir " + d.getVar('ARCHIVER_OUTDIR') + "'" cmdsrpm = cmd + " --define '_srcrpmdir " + d.getVar('ARCHIVER_RPMOUTDIR') + "'" @@ -726,6 +738,10 @@ python () { deps = ' rpm-native:do_populate_sysroot virtual/fakeroot-native:do_populate_sysroot' d.appendVarFlag('do_package_write_rpm', 'depends', deps) d.setVarFlag('do_package_write_rpm', 'fakeroot', '1') + + # Needed to ensure PKG_xxx renaming of dependency packages works + d.setVarFlag('do_package_write_rpm', 'deptask', "do_packagedata") + d.setVarFlag('do_package_write_rpm', 'rdeptask', "do_packagedata") } SSTATETASKS += "do_package_write_rpm" |