From patchwork Fri Jun 19 14:12:22 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ross Burton X-Patchwork-Id: 90530 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8BAACCD98F2 for ; Fri, 19 Jun 2026 14:12:35 +0000 (UTC) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.43301.1781878348992392459 for ; Fri, 19 Jun 2026 07:12:29 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: body hash did not verify" header.i=@arm.com header.s=foss header.b=Fnv1qTH7; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ross.burton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id D85FE2938 for ; Fri, 19 Jun 2026 07:12:23 -0700 (PDT) Received: from cesw-amp-gbt-1s-m12830-04.lab.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 26CF53F62B for ; Fri, 19 Jun 2026 07:12:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1781878348; bh=WxXjXgY5rgl7CdNTRh4i+BjGHoI61pb8CoM1podO0/8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Fnv1qTH7aG5d3z0C/AlGLm/1efoBJvuBfTHPIbHmBcwC2J7Mts52P1HsEuePrFFjj nfsaF1Nc/JxEt+JKmPWH/x0AdcxvxZHHCtZ8X/T0kxccwrBU8vYHgohu6KynftD5Fu tKW4jG/G2bijq46bSrCKrp/Z1oOKmp18in9M6ouc= From: Ross Burton To: openembedded-core@lists.openembedded.org Subject: [RFC PATCH 2/2] classes/archiver: remove SRPM mode Date: Fri, 19 Jun 2026 15:12:22 +0100 Message-ID: <20260619141222.4097163-2-ross.burton@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260619141222.4097163-1-ross.burton@arm.com> References: <20260619141222.4097163-1-ross.burton@arm.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 19 Jun 2026 14:12:35 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/239178 The archiver supports saving the source code in either a tarball or a Source RPM (SRPM). Tarballs are a logical choice as they're a standard format for source code, but SRPMs are primarily a way to distribute source plus packaging scripts for RPM-based distributions, and the SRPMs generated by the archiver do not include any packaging scripts. This can result in confusion when people may think that you can take the SRPM generated by the archiver and rebuild it with rpmbuild, whereas this will not work. I think we should remove the SRPM mode from the archiver on the grounds that tarballs are idiomatic for sharing software, and SRPMs are actively confusing. Signed-off-by: Ross Burton --- meta/classes-global/package_rpm.bbclass | 43 ------------------- meta/classes/archiver.bbclass | 28 ------------ .../default/local.conf.sample.extended | 7 +-- meta/lib/oeqa/selftest/cases/archiver.py | 12 ------ meta/lib/oeqa/selftest/cases/buildoptions.py | 4 +- 5 files changed, 3 insertions(+), 91 deletions(-) diff --git a/meta/classes-global/package_rpm.bbclass b/meta/classes-global/package_rpm.bbclass index f383ed140e6..9eacd91cbc3 100644 --- a/meta/classes-global/package_rpm.bbclass +++ b/meta/classes-global/package_rpm.bbclass @@ -101,34 +101,6 @@ 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): - if d.getVarFlag('ARCHIVER_MODE', 'srpm') == '1' and bb.data.inherits_class('archiver', d): - spec_files_bottom.append('%%prep') - spec_files_bottom.append('%s' % "echo \"include logs and patches, Please check them in SOURCES\"") - spec_files_bottom.append('') - - # append the name of tarball to key word 'SOURCE' in xxx.spec. - def tail_source(d): - if d.getVarFlag('ARCHIVER_MODE', 'srpm') == '1' and bb.data.inherits_class('archiver', d): - ar_outdir = d.getVar('ARCHIVER_OUTDIR') - if not os.path.exists(ar_outdir): - return - 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 - # exist in ARCHIVER_OUTDIR so skip if present. - if source.endswith(".src.rpm"): - continue - # The rpmbuild doesn't need the root permission, but it needs - # to know the file's user and group name, the only user and - # group in fakeroot is "root" when working in fakeroot. - f = os.path.join(ar_outdir, source) - os.chown(f, 0, 0) - spec_preamble_top.append('Source%s: %s' % (source_number, source)) - source_number += 1 - # In RPM, dependencies are of the format: pkg <>= Epoch:Version-Release # This format is similar to OE, however there are restrictions on the # characters that can be in a field. In the Version field, "-" @@ -402,11 +374,6 @@ python write_specfile () { # Gather special src/first package data if srcname == splitname: - archiving = d.getVarFlag('ARCHIVER_MODE', 'srpm') == '1' and \ - bb.data.inherits_class('archiver', d) - if archiving and srclicense != splitlicense: - bb.warn("The SRPM produced may not have the correct overall source license in the License tag. This is due to the LICENSE for the primary package and SRPM conflicting.") - srclicense = splitlicense srcrdepends = splitrdepends srcrrecommends = splitrrecommends @@ -530,7 +497,6 @@ python write_specfile () { del localdata - 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) @@ -544,7 +510,6 @@ python write_specfile () { spec_preamble_top.append('URL: %s' % srchomepage) if srccustomtagschunk: spec_preamble_top.append(srccustomtagschunk) - tail_source(d) # Replaces == Obsoletes && Provides robsoletes = bb.utils.explode_dep_versions2(srcrobsoletes) @@ -716,14 +681,6 @@ python do_package_rpm () { 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') + "'" - cmdsrpm = cmdsrpm + " -bs " + outspecfile - # Build the .src.rpm - d.setVar('SBUILDSPEC', cmdsrpm + "\n") - d.setVarFlag('SBUILDSPEC', 'func', '1') - bb.build.exec_func('SBUILDSPEC', d) cmd = cmd + " -bb " + outspecfile # rpm 4 creates various empty directories in _topdir, let's clean them up diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass index e27aee4e90a..3124b7040d4 100644 --- a/meta/classes/archiver.bbclass +++ b/meta/classes/archiver.bbclass @@ -17,8 +17,6 @@ # - The environment data, similar to 'bitbake -e recipe': # ARCHIVER_MODE[dumpdata] = "1" # - The recipe (.bb and .inc): ARCHIVER_MODE[recipe] = "1" -# - Whether output the .src.rpm package: -# ARCHIVER_MODE[srpm] = "1" # - Filter the license, the recipe whose license in # COPYLEFT_LICENSE_INCLUDE will be included, and in # COPYLEFT_LICENSE_EXCLUDE will be excluded. @@ -48,7 +46,6 @@ COPYLEFT_RECIPE_TYPES ?= 'target native nativesdk cross crosssdk cross-canadian' inherit copyleft_filter -ARCHIVER_MODE[srpm] ?= "0" ARCHIVER_MODE[src] ?= "patched" ARCHIVER_MODE[diff] ?= "0" ARCHIVER_MODE[diff-exclude] ?= ".pc autom4te.cache patches" @@ -61,8 +58,6 @@ DEPLOY_DIR_SRC ?= "${DEPLOY_DIR}/sources" ARCHIVER_TOPDIR ?= "${WORKDIR}/archiver-sources" ARCHIVER_ARCH = "${TARGET_SYS}" ARCHIVER_OUTDIR = "${ARCHIVER_TOPDIR}/${ARCHIVER_ARCH}/${PF}/" -ARCHIVER_RPMTOPDIR ?= "${WORKDIR}/deploy-sources-rpm" -ARCHIVER_RPMOUTDIR = "${ARCHIVER_RPMTOPDIR}/${ARCHIVER_ARCH}/${PF}/" ARCHIVER_WORKDIR = "${WORKDIR}/archiver-work/" # When producing a combined mirror directory, allow duplicates for the case @@ -154,29 +149,6 @@ python () { if ar_recipe == "1": d.appendVarFlag('do_deploy_archives', 'depends', ' %s:do_ar_recipe' % pn) - - # Output the SRPM package - if d.getVarFlag('ARCHIVER_MODE', 'srpm') == "1" and d.getVar('PACKAGES'): - if "package_rpm" not in d.getVar('PACKAGE_CLASSES'): - bb.fatal("ARCHIVER_MODE[srpm] needs package_rpm in PACKAGE_CLASSES") - - # Some recipes do not have any packaging tasks - if hasTask("do_package_write_rpm"): - d.appendVarFlag('do_deploy_archives', 'depends', ' %s:do_package_write_rpm' % pn) - d.appendVarFlag('do_package_write_rpm', 'dirs', ' ${ARCHIVER_RPMTOPDIR}') - d.appendVarFlag('do_package_write_rpm', 'sstate-inputdirs', ' ${ARCHIVER_RPMTOPDIR}') - d.appendVarFlag('do_package_write_rpm', 'sstate-outputdirs', ' ${DEPLOY_DIR_SRC}') - d.appendVar('PSEUDO_INCLUDE_PATHS', ',${ARCHIVER_TOPDIR}') - if ar_dumpdata == "1": - d.appendVarFlag('do_package_write_rpm', 'depends', ' %s:do_dumpdata' % pn) - if ar_recipe == "1": - d.appendVarFlag('do_package_write_rpm', 'depends', ' %s:do_ar_recipe' % pn) - if ar_src == "original": - d.appendVarFlag('do_package_write_rpm', 'depends', ' %s:do_ar_original' % pn) - elif ar_src == "patched": - d.appendVarFlag('do_package_write_rpm', 'depends', ' %s:do_ar_patched' % pn) - elif ar_src == "configured": - d.appendVarFlag('do_package_write_rpm', 'depends', ' %s:do_ar_configured' % pn) } do_ar_prepare[vardeps] += " \ diff --git a/meta/conf/templates/default/local.conf.sample.extended b/meta/conf/templates/default/local.conf.sample.extended index 999a09dac1c..bb9807637c8 100644 --- a/meta/conf/templates/default/local.conf.sample.extended +++ b/meta/conf/templates/default/local.conf.sample.extended @@ -238,16 +238,13 @@ # 6) the recipe (.bb and .inc): #ARCHIVER_MODE[recipe] = "1" # -# 7) Whether output the .src.rpm package: -#ARCHIVER_MODE[srpm] = "1" -# -# 8) Filter the license, the recipe whose license in +# 7) Filter the license, the recipe whose license in # COPYLEFT_LICENSE_INCLUDE will be included, and in # COPYLEFT_LICENSE_EXCLUDE will be excluded. #COPYLEFT_LICENSE_INCLUDE = 'GPL* LGPL*' #COPYLEFT_LICENSE_EXCLUDE = 'CLOSED Proprietary' # -# 9) Config the recipe type that will be archived, the type can be +# 8) Config the recipe type that will be archived, the type can be # target, native, nativesdk, cross, crosssdk and cross-canadian, # you can set one or more types. Archive all types by default. #COPYLEFT_RECIPE_TYPES = 'target' diff --git a/meta/lib/oeqa/selftest/cases/archiver.py b/meta/lib/oeqa/selftest/cases/archiver.py index 122d16b6557..8c5aa75e9b3 100644 --- a/meta/lib/oeqa/selftest/cases/archiver.py +++ b/meta/lib/oeqa/selftest/cases/archiver.py @@ -150,18 +150,6 @@ class Archiver(OESelftestTestCase): 'The task "%s" of the recipe "%s" has different signatures in "%s" for each machine in multiconfig' \ % (task, pn, locked_sigs_inc)) - def test_archiver_srpm_mode(self): - """ - Test that in srpm mode, the added recipe dependencies at least exist/work [YOCTO #11121] - """ - - features = 'INHERIT += "archiver"\n' - features += 'ARCHIVER_MODE[srpm] = "1"\n' - features += 'PACKAGE_CLASSES = "package_rpm"\n' - self.write_config(features) - - bitbake('-n selftest-nopackages selftest-ed') - def _test_archiver_mode(self, mode, target_file_name, extra_config=None): target = 'selftest-ed-native' diff --git a/meta/lib/oeqa/selftest/cases/buildoptions.py b/meta/lib/oeqa/selftest/cases/buildoptions.py index d9d37ebc7fb..59145df0fd6 100644 --- a/meta/lib/oeqa/selftest/cases/buildoptions.py +++ b/meta/lib/oeqa/selftest/cases/buildoptions.py @@ -147,15 +147,13 @@ class ArchiverTest(OESelftestTestCase): INHERIT += "archiver" PACKAGE_CLASSES = "package_rpm" ARCHIVER_MODE[src] = "original" -ARCHIVER_MODE[srpm] = "1" """) res = bitbake("xcursor-transparent-theme", ignore_status=True) self.assertEqual(res.status, 0, "\nCouldn't build xcursortransparenttheme.\nbitbake output %s" % res.output) deploy_dir_src = get_bb_var('DEPLOY_DIR_SRC') pkgs_path = g.glob(str(deploy_dir_src) + "/allarch*/xcurs*") - src_file_glob = str(pkgs_path[0]) + "/xcursor*.src.rpm" tar_file_glob = str(pkgs_path[0]) + "/xcursor*.tar.xz" - self.assertTrue((g.glob(src_file_glob) and g.glob(tar_file_glob)), "Couldn't find .src.rpm and .tar.xz files under %s/allarch*/xcursor*" % deploy_dir_src) + self.assertTrue(g.glob(tar_file_glob), "Couldn't find .tar.xz files under %s/allarch*/xcursor*" % deploy_dir_src) class ToolchainOptions(OESelftestTestCase): def test_toolchain_fortran(self):