Now-unneeded libdnf (4.x) recipe should also be removed? Alex
On Mon, 15 Dec 2025 at 11:05, Adam Duskett via lists.openembedded.org <[email protected]> wrote: > > Completely rewritten in C++, there are several changes needed > to facilitate moving from DNF4 to DNF5. Below are some significant > items to note: > > - The "-v/--verbose" cli option is removed. As such, remove the argument > everywhere it was called.[1] > > - the rpmverbosity cli option is replaced with --setopt=rpmverbosity > > - Change gpgcheck to pkg_gpgcheck as this is what the documentation > recommends.[2] > > - --nogpgcheck is now --no-gpgchecks > > - --setopt=protect_running_kernel=False has to be set or else every dnf > transaction complains that /boot/vmlinuz-${kernel_version} does not > exist in /var/log/dnf5.log. There is an open issue on github[3] to enable > the currently not-yet implemented `autocheck_running_kernel option`, but > it has been open for quite some time and the protect_running_kernel > option supresses the message. > > - Move --skip-broken to after the install argument as the global > --skip-broken argument is removed. > > - /var/cache/dnf is replaced with /var/cache/libdnf5 > > - Add `features += 'PACKAGECONFIG:append:pn-rpm = " sequoia"\n'` > `features += 'PACKAGECONFIG:append:pn-librepo = " sequoia"\n'` > to test_testimage_dnf as librepo currently does not work > with gpgme. > > While DNF5 has many config options, unfortunately, the majority > of them depends on sdbus-c++, which is not included in OE-core. > However, the package is included in meta-openembedded, so it's > best to include the PACKAGECONFIG options in the recipe and > leave them off. > > 1: https://github.com/rpm-software-management/dnf5/issues/464 > 2: https://dnf5.readthedocs.io/en/latest/dnf5.conf.5.html > 3: https://github.com/rpm-software-management/dnf5/issues/1255 > > Signed-off-by: Adam Duskett <[email protected]> > --- > V1 -> V2: > - Fix CVE_PRODUCT issues [Gyorgy] > - Add a tag to the SRC_URI [Gyorgy] > - Removed the plugin-manifest PACKAGECONFIG and set > -DWITH_PLUGIN_MANIFEST=OFF in EXTRA_OECMAKE > - Removed do_install:append:${PN}-plugins [Gyorgy] > - Fixed typo in SKIP_RECIPE[dnf] [Gyorgy] > - Changed commit message subject to "dnf: Upgrade to 5.3.0.0" [Paul] > > V2 -> V3: > - Moved --skip-broken to after the install argument to fix > do_populate_sdk failures. [Mathieu Dubois-Briand] > > .../lib/oeqa/runtime/cases/dnf_runtime.py | 6 +- > meta/conf/distro/include/maintainers.inc | 2 +- > meta/lib/oe/package_manager/rpm/__init__.py | 17 +- > meta/lib/oeqa/runtime/cases/dnf.py | 16 +- > meta/lib/oeqa/selftest/cases/runtime_test.py | 5 + > ...tly-install-tmpfiles.d-configuration.patch | 18 -- > ...ode-etc-and-systemd-unit-directories.patch | 26 --- > ...-hardcode-the-systemd-unit-directory.patch | 29 +++ > .../0001-dnf-write-the-log-lock-to-root.patch | 29 --- > .../0001-lock.py-fix-Exception-handling.patch | 62 ------ > ...et-python-path-for-completion_helper.patch | 21 -- > .../dnf/0002-cmake-set-CMP0190-to-OLD.patch | 51 +++++ > ...0003-Do-not-hardcode-system_cachedir.patch | 36 ++++ > ...004-add-support-for-gcc-12-and-below.patch | 96 +++++++++ > ...Do-not-prepend-installroot-to-logdir.patch | 28 --- > ...string-concatenation-errors-for-musl.patch | 100 +++++++++ > .../0006-add-missing-headers-for-musl.patch | 41 ++++ > .../0007-Define-FNM_EXTMATCH-for-musl.patch | 36 ++++ > ...rm-arch-mapping-issues-for-qemuarmv5.patch | 59 ++++++ > ...PYTHON_INSTALL_DIR-by-running-python.patch | 24 --- > .../0030-Run-python-scripts-using-env.patch | 34 ---- > meta/recipes-devtools/dnf/dnf_4.24.0.bb | 96 --------- > meta/recipes-devtools/dnf/dnf_5.3.0.0.bb | 192 ++++++++++++++++++ > 23 files changed, 668 insertions(+), 356 deletions(-) > delete mode 100644 > meta/recipes-devtools/dnf/dnf/0001-Corretly-install-tmpfiles.d-configuration.patch > delete mode 100644 > meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch > create mode 100644 > meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-the-systemd-unit-directory.patch > delete mode 100644 > meta/recipes-devtools/dnf/dnf/0001-dnf-write-the-log-lock-to-root.patch > delete mode 100644 > meta/recipes-devtools/dnf/dnf/0001-lock.py-fix-Exception-handling.patch > delete mode 100644 > meta/recipes-devtools/dnf/dnf/0001-set-python-path-for-completion_helper.patch > create mode 100644 > meta/recipes-devtools/dnf/dnf/0002-cmake-set-CMP0190-to-OLD.patch > create mode 100644 > meta/recipes-devtools/dnf/dnf/0003-Do-not-hardcode-system_cachedir.patch > create mode 100644 > meta/recipes-devtools/dnf/dnf/0004-add-support-for-gcc-12-and-below.patch > delete mode 100644 > meta/recipes-devtools/dnf/dnf/0005-Do-not-prepend-installroot-to-logdir.patch > create mode 100644 > meta/recipes-devtools/dnf/dnf/0005-fix-string-concatenation-errors-for-musl.patch > create mode 100644 > meta/recipes-devtools/dnf/dnf/0006-add-missing-headers-for-musl.patch > create mode 100644 > meta/recipes-devtools/dnf/dnf/0007-Define-FNM_EXTMATCH-for-musl.patch > create mode 100644 > meta/recipes-devtools/dnf/dnf/0008-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch > delete mode 100644 > meta/recipes-devtools/dnf/dnf/0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch > delete mode 100644 > meta/recipes-devtools/dnf/dnf/0030-Run-python-scripts-using-env.patch > delete mode 100644 meta/recipes-devtools/dnf/dnf_4.24.0.bb > create mode 100644 meta/recipes-devtools/dnf/dnf_5.3.0.0.bb > > diff --git a/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py > b/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py > index d2f0f88f7d..27158b5193 100644 > --- a/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py > +++ b/meta-selftest/lib/oeqa/runtime/cases/dnf_runtime.py > @@ -41,11 +41,11 @@ class DnfSelftest(DnfTest): > > import re > # Use '-y' for non-interactive mode: automatically import the feed > signing key > - output_makecache = self.dnf('-vy makecache') > + output_makecache = self.dnf('-y makecache') > self.assertTrue(re.match(r".*Failed to synchronize cache", > output_makecache, re.DOTALL) is None, msg = "dnf makecache failed to > synchronize repo: %s" %(output_makecache)) > self.assertTrue(re.match(r".*Metadata cache created", > output_makecache, re.DOTALL) is not None, msg = "dnf makecache failed: %s" > %(output_makecache)) > > - output_repoinfo = self.dnf('-v repoinfo') > - matchobj = re.match(r".*Repo-pkgs\s*:\s*(?P<n_pkgs>[0-9]+)", > output_repoinfo, re.DOTALL) > + output_repoinfo = self.dnf('repoinfo') > + matchobj = re.match(r".*Total packages\s*:\s*(?P<n_pkgs>[0-9]+)", > output_repoinfo, re.DOTALL) > self.assertTrue(matchobj is not None, msg = "Could not find the > amount of packages in dnf repoinfo output: %s" %(output_repoinfo)) > self.assertTrue(int(matchobj.group('n_pkgs')) > 0, msg = "Amount of > remote packages is not more than zero: %s\n" %(output_repoinfo)) > diff --git a/meta/conf/distro/include/maintainers.inc > b/meta/conf/distro/include/maintainers.inc > index da642ac3c5..222c09acf5 100644 > --- a/meta/conf/distro/include/maintainers.inc > +++ b/meta/conf/distro/include/maintainers.inc > @@ -155,7 +155,7 @@ RECIPE_MAINTAINER:pn-diffutils = "Chen Qi > <[email protected]>" > RECIPE_MAINTAINER:pn-distcc = "Hongxu Jia <[email protected]>" > RECIPE_MAINTAINER:pn-distcc-config = "Yi Zhao <[email protected]>" > RECIPE_MAINTAINER:pn-dmidecode = "Unassigned <[email protected]>" > -RECIPE_MAINTAINER:pn-dnf = "Unassigned <[email protected]>" > +RECIPE_MAINTAINER:pn-dnf = "Adam Duskett <[email protected]>" > RECIPE_MAINTAINER:pn-docbook-xml-dtd4 = "Yi Zhao <[email protected]>" > RECIPE_MAINTAINER:pn-docbook-xsl-stylesheets = "Yi Zhao > <[email protected]>" > RECIPE_MAINTAINER:pn-dos2unix = "Khem Raj <[email protected]>" > diff --git a/meta/lib/oe/package_manager/rpm/__init__.py > b/meta/lib/oe/package_manager/rpm/__init__.py > index 1d831745ff..d617ca0404 100644 > --- a/meta/lib/oe/package_manager/rpm/__init__.py > +++ b/meta/lib/oe/package_manager/rpm/__init__.py > @@ -163,7 +163,7 @@ class RpmPM(PackageManager): > gpg_opts += > 'gpgkey=file://%s/pki/packagefeed-gpg/PACKAGEFEED-GPG-KEY-%s-%s\n' % > (self.d.getVar('sysconfdir'), self.d.getVar('DISTRO'), > self.d.getVar('DISTRO_CODENAME')) > > if self.d.getVar('RPM_SIGN_PACKAGES') != '1': > - gpg_opts += 'gpgcheck=0\n' > + gpg_opts += 'pkg_gpgcheck=0\n' > > bb.utils.mkdirhier(oe.path.join(self.target_rootfs, "etc", > "yum.repos.d")) > remote_uris = self.construct_uris(feed_uris.split(), > feed_base_paths.split()) > @@ -200,11 +200,11 @@ class RpmPM(PackageManager): > package_exclude = self.d.getVar('PACKAGE_EXCLUDE') > exclude_pkgs = (bad_recommendations.split() if bad_recommendations > else []) + (package_exclude.split() if package_exclude else []) > > - output = self._invoke_dnf((["--skip-broken"] if attempt_only else > []) + > - (["-x", ",".join(exclude_pkgs)] if > len(exclude_pkgs) > 0 else []) + > + output = self._invoke_dnf((["-x", ",".join(exclude_pkgs)] if > len(exclude_pkgs) > 0 else []) + > (["--setopt=install_weak_deps=False"] if > (hard_depends_only or self.d.getVar('NO_RECOMMENDATIONS') == "1") else []) + > - (["--nogpgcheck"] if > self.d.getVar('RPM_SIGN_PACKAGES') != '1' else ["--setopt=gpgcheck=True"]) + > + (["--no-gpgchecks"] if > self.d.getVar('RPM_SIGN_PACKAGES') != '1' else > ["--setopt=pkg_gpgcheck=True"]) + > ["install"] + > + (["--skip-broken"] if attempt_only else []) + > pkgs) > > failed_scriptlets_pkgnames = collections.OrderedDict() > @@ -313,10 +313,15 @@ class RpmPM(PackageManager): > def _invoke_dnf(self, dnf_args, fatal = True, print_output = True ): > os.environ['RPM_ETCCONFIGDIR'] = self.target_rootfs > > + # Set XDG_CACHE_HOME to avoid dnf attempting to install oe-repo > system cache to a /tmp/ directory on the host. > + os.environ['XDG_CACHE_HOME'] = > oe.path.join(os.path.join(self.target_rootfs, "var/cache/libdnf5")) > + > dnf_cmd = bb.utils.which(os.getenv('PATH'), "dnf") > - standard_dnf_args = ["-v", "--rpmverbosity=info", "-y", > - "-c", oe.path.join(self.target_rootfs, > "etc/dnf/dnf.conf"), > + standard_dnf_args = ["-y", > + "--config", oe.path.join(self.target_rootfs, > "etc/dnf/dnf.conf"), > + "--setopt=rpmverbosity=info", > "--setopt=reposdir=%s" > %(oe.path.join(self.target_rootfs, "etc/yum.repos.d")), > + "--setopt=pluginconfpath=%s" > %(os.path.join(self.d.getVar('STAGING_DIR_NATIVE'), "etc/dnf/dnf.conf")), > "--installroot=%s" % (self.target_rootfs), > "--setopt=logdir=%s" % (self.d.getVar('T')) > ] > diff --git a/meta/lib/oeqa/runtime/cases/dnf.py > b/meta/lib/oeqa/runtime/cases/dnf.py > index 3ccb18ce83..1becc8d8a0 100644 > --- a/meta/lib/oeqa/runtime/cases/dnf.py > +++ b/meta/lib/oeqa/runtime/cases/dnf.py > @@ -17,7 +17,7 @@ from oeqa.runtime.decorator.package import OEHasPackage > class DnfTest(OERuntimeTestCase): > > def dnf(self, command, expected = 0): > - command = 'dnf %s' % command > + command = 'dnf --setopt=protect_running_kernel=False %s' % command > status, output = self.target.run(command, 1500) > message = os.linesep.join([command, output]) > self.assertEqual(status, expected, message) > @@ -48,7 +48,7 @@ class DnfBasicTest(DnfTest): > > @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) > def test_dnf_history(self): > - self.dnf('history') > + self.dnf('history list') > > class DnfRepoTest(DnfTest): > > @@ -68,7 +68,7 @@ class DnfRepoTest(DnfTest): > deploy_url = 'http://%s:%s/' %(self.target.server_ip, > self.repo_server.port) > cmdlinerepoopts = ["--repofrompath=oe-testimage-repo-%s,%s%s" > %(arch, deploy_url, arch) for arch in pkgarchs] > > - output = self.dnf(" ".join(cmdlinerepoopts) + " --nogpgcheck " + > command) > + output = self.dnf(" ".join(cmdlinerepoopts) + " --no-gpgchecks " + > command) > return output > > @OETestDepends(['dnf.DnfBasicTest.test_dnf_help']) > @@ -96,7 +96,7 @@ class DnfRepoTest(DnfTest): > def test_dnf_install_from_disk(self): > self.dnf_with_repo('remove -y dnf-test-dep') > self.dnf_with_repo('install -y --downloadonly dnf-test-dep') > - status, output = self.target.run('find /var/cache/dnf -name > dnf-test-dep*rpm') > + status, output = self.target.run('find /var/cache/libdnf5 -name > dnf-test-dep*rpm') > self.assertEqual(status, 0, output) > self.dnf_with_repo('install -y %s' % output) > > @@ -134,8 +134,8 @@ class DnfRepoTest(DnfTest): > self.target.run('cp -r /etc/dnf %s/etc' % rootpath, 1500) > self.target.run('cp /bin/sh %s/bin' % rootpath, 1500) > self.target.run('mount -o bind /dev %s/dev/' % rootpath, 1500) > - self.dnf_with_repo('install --installroot=%s -v -y > --rpmverbosity=debug busybox' % rootpath) > - status, output = self.target.run('test -e %s/var/cache/dnf' % > rootpath, 1500) > + self.dnf_with_repo('install --installroot=%s -y busybox' % rootpath) > + status, output = self.target.run('test -e %s/var/cache/libdnf5' % > rootpath, 1500) > self.assertEqual(0, status, output) > status, output = self.target.run('test -e %s/bin/busybox' % > rootpath, 1500) > self.assertEqual(0, status, output) > @@ -158,8 +158,8 @@ class DnfRepoTest(DnfTest): > self.target.run('cp -r /etc/dnf %s/etc' % rootpath) > self.target.run('cp /bin/busybox %s/bin/sh' % rootpath) > self.target.run('mount -o bind /dev %s/dev/' % rootpath) > - self.dnf_with_repo('install --installroot=%s -v -y > --rpmverbosity=debug busybox' % rootpath) > - status, output = self.target.run('test -e %s/var/cache/dnf' % > rootpath) > + self.dnf_with_repo('install --installroot=%s -y busybox' % rootpath) > + status, output = self.target.run('test -e %s/var/cache/libdnf5' % > rootpath) > self.assertEqual(0, status, output) > status, output = self.target.run('test -e %s/bin/busybox' % rootpath) > self.assertEqual(0, status, output) > diff --git a/meta/lib/oeqa/selftest/cases/runtime_test.py > b/meta/lib/oeqa/selftest/cases/runtime_test.py > index d58ffa80f5..f6d441b50a 100644 > --- a/meta/lib/oeqa/selftest/cases/runtime_test.py > +++ b/meta/lib/oeqa/selftest/cases/runtime_test.py > @@ -163,6 +163,11 @@ TEST_RUNQEMUPARAMS += " slirp" > features += 'EXTRA_IMAGE_FEATURES += "package-management"\n' > features += 'PACKAGE_CLASSES = "package_rpm"\n' > > + # librepo and rpm require sequoia > + # https://github.com/rpm-software-management/dnf5/issues/2539 > + features += 'PACKAGECONFIG:append:pn-rpm = " sequoia"\n' > + features += 'PACKAGECONFIG:append:pn-librepo = " sequoia"\n' > + > bitbake('gnupg-native -c addto_recipe_sysroot') > > # Enable package feed signing > diff --git > a/meta/recipes-devtools/dnf/dnf/0001-Corretly-install-tmpfiles.d-configuration.patch > > b/meta/recipes-devtools/dnf/dnf/0001-Corretly-install-tmpfiles.d-configuration.patch > deleted file mode 100644 > index fd942228b9..0000000000 > --- > a/meta/recipes-devtools/dnf/dnf/0001-Corretly-install-tmpfiles.d-configuration.patch > +++ /dev/null > @@ -1,18 +0,0 @@ > -From f70eb308c837f2c944e23bb680a501a605004d65 Mon Sep 17 00:00:00 2001 > -From: Alexander Kanavin <[email protected]> > -Date: Thu, 26 Jan 2017 16:36:20 +0200 > -Subject: [PATCH] Corretly install tmpfiles.d configuration > - > -Upstream-Status: Inappropriate [oe-core specific] > -Signed-off-by: Alexander Kanavin <[email protected]> > ---- > - etc/tmpfiles.d/CMakeLists.txt | 2 +- > - 1 file changed, 1 insertion(+), 1 deletion(-) > - > -diff --git a/etc/tmpfiles.d/CMakeLists.txt b/etc/tmpfiles.d/CMakeLists.txt > -index f69c773e..3eb6d0e8 100644 > ---- a/etc/tmpfiles.d/CMakeLists.txt > -+++ b/etc/tmpfiles.d/CMakeLists.txt > -@@ -1 +1 @@ > --INSTALL (FILES dnf.conf DESTINATION /usr/lib/tmpfiles.d/) > -+INSTALL (FILES dnf.conf DESTINATION ${SYSCONFDIR}/tmpfiles.d/) > diff --git > a/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch > > b/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch > deleted file mode 100644 > index 9d978cdc5f..0000000000 > --- > a/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch > +++ /dev/null > @@ -1,26 +0,0 @@ > -From c2b2b91b58f4531d4baf0a01f5d868d71e577a84 Mon Sep 17 00:00:00 2001 > -From: Alexander Kanavin <[email protected]> > -Date: Thu, 26 Jan 2017 16:25:47 +0200 > -Subject: [PATCH] Do not hardcode /etc and systemd unit directories > - > -Upstream-Status: Inappropriate [oe-core specific] > -Signed-off-by: Alexander Kanavin <[email protected]> > ---- > - CMakeLists.txt | 4 ++-- > - 1 file changed, 2 insertions(+), 2 deletions(-) > - > -diff --git a/CMakeLists.txt b/CMakeLists.txt > -index e71e9517..8fcb2069 100644 > ---- a/CMakeLists.txt > -+++ b/CMakeLists.txt > -@@ -3,8 +3,8 @@ PROJECT (dnf NONE) > - > - INCLUDE (${CMAKE_SOURCE_DIR}/VERSION.cmake) > - > --SET( SYSCONFDIR /etc) > --SET( SYSTEMD_DIR /usr/lib/systemd/system) > -+SET( SYSCONFDIR ${CMAKE_INSTALL_SYSCONFDIR}) > -+SET( SYSTEMD_DIR $ENV{systemd_system_unitdir}) > - > - IF (NOT PYTHON_DESIRED) > - FIND_PACKAGE (PythonInterp REQUIRED) > diff --git > a/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-the-systemd-unit-directory.patch > > b/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-the-systemd-unit-directory.patch > new file mode 100644 > index 0000000000..f82a0fca3c > --- /dev/null > +++ > b/meta/recipes-devtools/dnf/dnf/0001-Do-not-hardcode-the-systemd-unit-directory.patch > @@ -0,0 +1,29 @@ > +From c263a746dac19d140fb31d07f1c4d4cb96750666 Mon Sep 17 00:00:00 2001 > +From: Adam Duskett <[email protected]> > +Date: Thu, 27 Nov 2025 11:07:48 +0100 > +Subject: [PATCH] Do not hardcode the systemd unit directory > + > +Upstream-Status: Inappropriate [oe-core specific] > + > +Rebased for 5.3.0.0 > +Signed-off-by: Adam Duskett <[email protected]> > +--- > + CMakeLists.txt | 2 +- > + 1 file changed, 1 insertion(+), 1 deletion(-) > + > +diff --git a/CMakeLists.txt b/CMakeLists.txt > +index 0507e30..0537e85 100644 > +--- a/CMakeLists.txt > ++++ b/CMakeLists.txt > +@@ -7,7 +7,7 @@ project(dnf5 LANGUAGES CXX C VERSION > ${VERSION_PRIME}.${VERSION_MAJOR}.${VERSION > + cmake_policy(VERSION ${CMAKE_VERSION}) > + > + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") > +-set(SYSTEMD_DIR "/usr/lib/systemd/system") > ++set(SYSTEMD_DIR $ENV{systemd_system_unitdir}) > + > + message("Building ${PROJECT_NAME} version ${PROJECT_VERSION}") > + > +-- > +2.52.0 > + > diff --git > a/meta/recipes-devtools/dnf/dnf/0001-dnf-write-the-log-lock-to-root.patch > b/meta/recipes-devtools/dnf/dnf/0001-dnf-write-the-log-lock-to-root.patch > deleted file mode 100644 > index 18f9a30949..0000000000 > --- a/meta/recipes-devtools/dnf/dnf/0001-dnf-write-the-log-lock-to-root.patch > +++ /dev/null > @@ -1,29 +0,0 @@ > -From 049e2832284ab883e185d9020c881518a68e6c38 Mon Sep 17 00:00:00 2001 > -From: Alexander Kanavin <[email protected]> > -Date: Tue, 28 Apr 2020 15:55:00 +0200 > -Subject: [PATCH] dnf: write the log lock to root > - > -Writing it to /var/log appears to be racing with installation > -of base-files, and if lock is created first, base-files > -will refuse to install (due to the target directory > -already existing, and base-files creating it as a symlink). > - > -Upstream-Status: Inappropriate [oe-core specific] > -Signed-off-by: Alexander Kanavin <[email protected]> > ---- > - dnf/logging.py | 2 +- > - 1 file changed, 1 insertion(+), 1 deletion(-) > - > -diff --git a/dnf/logging.py b/dnf/logging.py > -index ef0b25f3..94610af6 100644 > ---- a/dnf/logging.py > -+++ b/dnf/logging.py > -@@ -118,7 +118,7 @@ class > MultiprocessRotatingFileHandler(logging.handlers.RotatingFileHandler): > - def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, > encoding=None, delay=False): > - super(MultiprocessRotatingFileHandler, self).__init__( > - filename, mode, maxBytes, backupCount, encoding, delay) > -- self.rotate_lock = dnf.lock.build_log_lock("/var/log/", True) > -+ self.rotate_lock = dnf.lock.build_log_lock("/", True) > - > - def emit(self, record): > - while True: > diff --git > a/meta/recipes-devtools/dnf/dnf/0001-lock.py-fix-Exception-handling.patch > b/meta/recipes-devtools/dnf/dnf/0001-lock.py-fix-Exception-handling.patch > deleted file mode 100644 > index 6bffe9af0a..0000000000 > --- a/meta/recipes-devtools/dnf/dnf/0001-lock.py-fix-Exception-handling.patch > +++ /dev/null > @@ -1,62 +0,0 @@ > -From 3881757eabfde2ff54400ab127b106ab085d83f0 Mon Sep 17 00:00:00 2001 > -From: Changqing Li <[email protected]> > -Date: Wed, 13 Mar 2024 11:22:05 +0800 > -Subject: [PATCH] lock.py: fix Exception handling > - > -Before, when logdir is not writable, _try_lock will raise an Exception > -like "Permission denied: '/var/log/log_lock.pid'", and in this case, > -_unlock_thread will not be called and the variable count will not be > -handled, it maybe cause log_lock.pid not be deleted in case like [1]. > - > -For [1], it is an cross compile case, when dnf install some packages to > -rootfs, seems like some threads don't do chroot like work, some threads > -do chroot like work. so for the threads don't do chroot, "Permission denied" > -Exception happend, for the threads that do chroot, log_lock.pid will be > -created under installroot/var/log/log_lock.pid, since variable count not > -handled correct before, log_lock.pid may not be deleted correctly. > - > -So fixed like this, if _try_lock raise Exception, _unlock_thread first, > -then raise the Exception. > - > -[1] https://github.com/rpm-software-management/dnf/issues/1963 > - > -Upstream-Status: Submitted [ > https://github.com/rpm-software-management/dnf/pull/2065 ] > - > -Signed-off-by: Changqing Li <[email protected]> > ---- > - dnf/lock.py | 12 ++++++++++-- > - 1 file changed, 10 insertions(+), 2 deletions(-) > - > -diff --git a/dnf/lock.py b/dnf/lock.py > -index 6817aac9..5718062a 100644 > ---- a/dnf/lock.py > -+++ b/dnf/lock.py > -@@ -128,7 +128,11 @@ class ProcessLock(object): > - self._lock_thread() > - prev_pid = -1 > - my_pid = os.getpid() > -- pid = self._try_lock(my_pid) > -+ try: > -+ pid = self._try_lock(my_pid) > -+ except Exception: > -+ self._unlock_thread() > -+ raise > - while pid != my_pid: > - if pid != -1: > - if not self.blocking: > -@@ -140,7 +144,11 @@ class ProcessLock(object): > - logger.info(msg) > - prev_pid = pid > - time.sleep(1) > -- pid = self._try_lock(my_pid) > -+ try: > -+ pid = self._try_lock(my_pid) > -+ except Exception: > -+ self._unlock_thread() > -+ raise > - > - def __exit__(self, *exc_args): > - if self.count == 1: > --- > -2.25.1 > - > diff --git > a/meta/recipes-devtools/dnf/dnf/0001-set-python-path-for-completion_helper.patch > > b/meta/recipes-devtools/dnf/dnf/0001-set-python-path-for-completion_helper.patch > deleted file mode 100644 > index fcd970a7ae..0000000000 > --- > a/meta/recipes-devtools/dnf/dnf/0001-set-python-path-for-completion_helper.patch > +++ /dev/null > @@ -1,21 +0,0 @@ > -From fa32c7dcabaa3c00d3620a3266e49629365c0cbe Mon Sep 17 00:00:00 2001 > -From: Jeremy Puhlman <[email protected]> > -Date: Wed, 11 Mar 2020 22:10:02 +0000 > -Subject: [PATCH] set python path for completion_helper > - > -Upstream-Status: Inappropriate [oe-core specific] > -Signed-off-by: Jeremy Puhlman <[email protected]> > ---- > - dnf/cli/completion_helper.py.in | 2 +- > - 1 file changed, 1 insertion(+), 1 deletion(-) > - > -diff --git a/dnf/cli/completion_helper.py.in > b/dnf/cli/completion_helper.py.in > -index 0da0f2a2..9330d15b 100644 > ---- a/dnf/cli/completion_helper.py.in > -+++ b/dnf/cli/completion_helper.py.in > -@@ -1,4 +1,4 @@ > --#!@PYTHON_EXECUTABLE@ > -+#!/usr/bin/env python3 > - # > - # This file is part of dnf. > - # > diff --git > a/meta/recipes-devtools/dnf/dnf/0002-cmake-set-CMP0190-to-OLD.patch > b/meta/recipes-devtools/dnf/dnf/0002-cmake-set-CMP0190-to-OLD.patch > new file mode 100644 > index 0000000000..3ac3923956 > --- /dev/null > +++ b/meta/recipes-devtools/dnf/dnf/0002-cmake-set-CMP0190-to-OLD.patch > @@ -0,0 +1,51 @@ > +From 8eb5a6208fd9edfa7796d974b2e5256b05ffe001 Mon Sep 17 00:00:00 2001 > +From: Adam Duskett <[email protected]> > +Date: Thu, 27 Nov 2025 11:49:43 +0100 > +Subject: [PATCH] cmake: set CMP0190 to OLD > + > +Starting with CMake 4.1, cross-compiling python3 requires setting > +-DCMAKE_CROSSCOMPILING_EMULATOR which can be done by inheriting > +cmake-qemu. However, this leads to the following error: > +Interpreter: Cannot run the interpreter ".../python3-native/python3" > + > +This is due to the target sysroot python3 binary not being installed > +because it can't be executed. > + > +Set CMP0190 to old to force the old behavior. > + > +https://cmake.org/cmake/help/latest/policy/CMP0190.html > + > +Upstream-Status: Inappropriate [oe-core specific] > +Signed-off-by: Adam Duskett <[email protected]> > +--- > + bindings/python3/CMakeLists.txt | 1 + > + libdnf5-plugins/python_plugins_loader/CMakeLists.txt | 1 + > + 2 files changed, 2 insertions(+) > + > +diff --git a/bindings/python3/CMakeLists.txt > b/bindings/python3/CMakeLists.txt > +index fa7033d..4bfa434 100644 > +--- a/bindings/python3/CMakeLists.txt > ++++ b/bindings/python3/CMakeLists.txt > +@@ -6,6 +6,7 @@ endif() > + message("Building bindings for python3") > + > + > ++cmake_policy(SET CMP0190 OLD) > + find_package(Python3 REQUIRED COMPONENTS Interpreter Development) > + include_directories(${Python3_INCLUDE_DIRS}) > + > +diff --git a/libdnf5-plugins/python_plugins_loader/CMakeLists.txt > b/libdnf5-plugins/python_plugins_loader/CMakeLists.txt > +index 5454a5d..d4a9915 100644 > +--- a/libdnf5-plugins/python_plugins_loader/CMakeLists.txt > ++++ b/libdnf5-plugins/python_plugins_loader/CMakeLists.txt > +@@ -6,6 +6,7 @@ if(NOT WITH_PYTHON_PLUGINS_LOADER) > + return() > + endif() > + > ++cmake_policy(SET CMP0190 OLD) > + find_package(Python3 REQUIRED COMPONENTS Interpreter Development) > + find_package(SWIG REQUIRED) > + include_directories(${Python3_INCLUDE_DIRS}) > +-- > +2.52.0 > + > diff --git > a/meta/recipes-devtools/dnf/dnf/0003-Do-not-hardcode-system_cachedir.patch > b/meta/recipes-devtools/dnf/dnf/0003-Do-not-hardcode-system_cachedir.patch > new file mode 100644 > index 0000000000..825368b760 > --- /dev/null > +++ b/meta/recipes-devtools/dnf/dnf/0003-Do-not-hardcode-system_cachedir.patch > @@ -0,0 +1,36 @@ > +From d0718ed10c1c255850fff5922f533bceef10f659 Mon Sep 17 00:00:00 2001 > +From: Adam Duskett <[email protected]> > +Date: Thu, 27 Nov 2025 11:50:20 +0100 > +Subject: [PATCH] Do not hardcode system_cachedir > + > +Because dnf is ran in a fakeroot environment, the UID of the > +"user" is 0, and the hardcoded paths to the host system are > +attempted, leading to the following error: > + > +[log_check] DEBUG: Failed to expire repository cache in path > "/var/cache/libdnf5/ > + > +Remove the check for geteuid() == 0 and rely only on the > +user cache dir. > + > +Upstream-Status: Inappropriate [oe-core specific] > +Signed-off-by: Adam Duskett <[email protected]> > +--- > + libdnf5/conf/config_main.cpp | 2 +- > + 1 file changed, 1 insertion(+), 1 deletion(-) > + > +diff --git a/libdnf5/conf/config_main.cpp b/libdnf5/conf/config_main.cpp > +index a83e4a2..ebdea4d 100644 > +--- a/libdnf5/conf/config_main.cpp > ++++ b/libdnf5/conf/config_main.cpp > +@@ -237,7 +237,7 @@ class ConfigMain::Impl { > + // Repo main config > + > + OptionNumber<std::uint32_t> retries{10}; > +- OptionPath cachedir{geteuid() == 0 ? SYSTEM_CACHEDIR : > libdnf5::xdg::get_user_cache_dir() / "libdnf5"}; > ++ OptionPath cachedir{libdnf5::xdg::get_user_cache_dir() / "libdnf5"}; > + OptionBool fastestmirror{false}; > + OptionStringAppendList excludeenvs{std::vector<std::string>{}}; > + OptionStringAppendList excludegroups{std::vector<std::string>{}}; > +-- > +2.52.0 > + > diff --git > a/meta/recipes-devtools/dnf/dnf/0004-add-support-for-gcc-12-and-below.patch > b/meta/recipes-devtools/dnf/dnf/0004-add-support-for-gcc-12-and-below.patch > new file mode 100644 > index 0000000000..e0684434b1 > --- /dev/null > +++ > b/meta/recipes-devtools/dnf/dnf/0004-add-support-for-gcc-12-and-below.patch > @@ -0,0 +1,96 @@ > +From cb0a8fcf3676dcebc87880872ea5b4ddfadd9c5c Mon Sep 17 00:00:00 2001 > +From: Adam Duskett <[email protected]> > +Date: Thu, 27 Nov 2025 11:08:41 +0100 > +Subject: [PATCH] add support for gcc 12 and below > + > + - Add missing headers for gcc <= 12 > + - Add support for libfmt if the format header is not found > + > +Note: This patch should be removed once the minimum GCC version > +for Yocto is >= 13. > + > +Upstream-Status: Inappropriate [oe-core specific] > +Signed-off-by: Adam Duskett <[email protected]> > +--- > + libdnf5/CMakeLists.txt | 8 ++++++++ > + libdnf5/base/goal_elements.cpp | 2 +- > + libdnf5/conf/config_main.cpp | 8 ++++++++ > + libdnf5/logger/memory_buffer_logger.cpp | 1 + > + 4 files changed, 18 insertions(+), 1 deletion(-) > + > +diff --git a/libdnf5/CMakeLists.txt b/libdnf5/CMakeLists.txt > +index fa4c9d1..06a1f01 100644 > +--- a/libdnf5/CMakeLists.txt > ++++ b/libdnf5/CMakeLists.txt > +@@ -7,6 +7,9 @@ if (NOT WITH_MODULEMD) > + list(REMOVE_ITEM LIBDNF5_SOURCES ${LIBDNF5_SOURCES_MODULES}) > + endif() > + > ++include(CheckIncludeFileCXX) > ++check_include_file_cxx("format" CXX_FORMAT_SUPPORT) > ++ > + # create config header file > + configure_file("config.h.in" ${CMAKE_CURRENT_SOURCE_DIR}/conf/config.h) > + > +@@ -47,6 +50,11 @@ set_target_properties(libdnf5 PROPERTIES OUTPUT_NAME > "dnf5") > + set_target_properties(libdnf5 PROPERTIES SOVERSION ${DNF_SO_VERSION}) > + # required to have dlopen symbol > + target_link_libraries(libdnf5 PUBLIC ${CMAKE_DL_LIBS}) > ++if (NOT CXX_FORMAT_SUPPORT) > ++ find_package(fmt REQUIRED) > ++ target_link_libraries(libdnf5_obj PRIVATE fmt::fmt) > ++ target_compile_definitions(libdnf5_obj PUBLIC USE_FMTLIB) > ++endif() > + > + # required by clang > + target_link_libraries(libdnf5 PUBLIC stdc++) > +diff --git a/libdnf5/base/goal_elements.cpp b/libdnf5/base/goal_elements.cpp > +index 9caaf54..572f327 100644 > +--- a/libdnf5/base/goal_elements.cpp > ++++ b/libdnf5/base/goal_elements.cpp > +@@ -17,7 +17,7 @@ > + // You should have received a copy of the GNU Lesser General Public License > + // along with libdnf. If not, see <https://www.gnu.org/licenses/>. > + > +- > ++#include <optional> > + #include "libdnf5/base/goal_elements.hpp" > + > + #include "libdnf5/common/exception.hpp" > +diff --git a/libdnf5/conf/config_main.cpp b/libdnf5/conf/config_main.cpp > +index ebdea4d..a93b545 100644 > +--- a/libdnf5/conf/config_main.cpp > ++++ b/libdnf5/conf/config_main.cpp > +@@ -37,9 +37,17 @@ > + #include <algorithm> > + #include <array> > + #include <cctype> > ++#include <optional> > + #include <sstream> > + #include <utility> > + > ++#ifdef USE_FMTLIB > ++#include <fmt/core.h> > ++namespace std { > ++ using fmt::format; > ++} > ++#endif > ++ > + namespace libdnf5 { > + > + /// @brief Converts a friendly bandwidth option to bytes > +diff --git a/libdnf5/logger/memory_buffer_logger.cpp > b/libdnf5/logger/memory_buffer_logger.cpp > +index 85bf707..89307e9 100644 > +--- a/libdnf5/logger/memory_buffer_logger.cpp > ++++ b/libdnf5/logger/memory_buffer_logger.cpp > +@@ -20,6 +20,7 @@ > + #include "libdnf5/logger/memory_buffer_logger.hpp" > + > + #include <mutex> > ++#include <vector> > + > + namespace libdnf5 { > + > +-- > +2.52.0 > + > diff --git > a/meta/recipes-devtools/dnf/dnf/0005-Do-not-prepend-installroot-to-logdir.patch > > b/meta/recipes-devtools/dnf/dnf/0005-Do-not-prepend-installroot-to-logdir.patch > deleted file mode 100644 > index a1c58d6563..0000000000 > --- > a/meta/recipes-devtools/dnf/dnf/0005-Do-not-prepend-installroot-to-logdir.patch > +++ /dev/null > @@ -1,28 +0,0 @@ > -From 0e7fc4a8523aad616493e6ad33c509e1e530d852 Mon Sep 17 00:00:00 2001 > -From: Alexander Kanavin <[email protected]> > -Date: Wed, 11 Jan 2017 15:10:13 +0200 > -Subject: [PATCH] Do not prepend installroot to logdir. > - > -This would otherwise write the logs into rootfs/var/log > -(whereas we want them in $T), > -and will break installation of base-files rpm. > - > -Upstream-Status: Inappropriate [oe-core specific] > -Signed-off-by: Alexander Kanavin <[email protected]> > ---- > - dnf/cli/cli.py | 2 +- > - 1 file changed, 1 insertion(+), 1 deletion(-) > - > -diff --git a/dnf/cli/cli.py b/dnf/cli/cli.py > -index d3844df3..ac080f79 100644 > ---- a/dnf/cli/cli.py > -+++ b/dnf/cli/cli.py > -@@ -954,7 +954,7 @@ class Cli(object): > - logger.warning(_("Unable to detect release version (use > '--releasever' to specify " > - "release version)")) > - > -- for opt in ('cachedir', 'logdir', 'persistdir'): > -+ for opt in ('cachedir', 'persistdir'): > - conf.prepend_installroot(opt) > - > - self.base._logging._setup_from_dnf_conf(conf) > diff --git > a/meta/recipes-devtools/dnf/dnf/0005-fix-string-concatenation-errors-for-musl.patch > > b/meta/recipes-devtools/dnf/dnf/0005-fix-string-concatenation-errors-for-musl.patch > new file mode 100644 > index 0000000000..537cf1fa5d > --- /dev/null > +++ > b/meta/recipes-devtools/dnf/dnf/0005-fix-string-concatenation-errors-for-musl.patch > @@ -0,0 +1,100 @@ > +From 9ffae0be82214e80d3476bce53efc7c9fc23f494 Mon Sep 17 00:00:00 2001 > +From: Adam Duskett <[email protected]> > +Date: Thu, 27 Nov 2025 11:53:43 +0100 > +Subject: [PATCH] fix string concatenation errors for musl > + > +Glibc uses some fancy overloading to ensure strchr returns a const char * > +if a char * is passed as an argument. However, musl does not, which leads > +to several `error: no matching function for call to > 'std::__cxx11::basic_string<char>::basic_string(const char*&, char*&)'` > +errors. > + > +Change the variables declaration to const auto * const to fix > +the problem. > + > +Upstream-Status: Backport > [https://github.com/rpm-software-management/dnf5/commit/5902c3b4e90410df2c604e429ec03f72137c9b19] > +Signed-off-by: Adam Duskett <[email protected]> > +--- > + dnf5-plugins/config-manager_plugin/addrepo.cpp | 2 +- > + dnf5-plugins/config-manager_plugin/setopt.cpp | 2 +- > + dnf5-plugins/config-manager_plugin/setvar.cpp | 2 +- > + dnf5/main.cpp | 4 ++-- > + dnf5daemon-client/main.cpp | 2 +- > + 5 files changed, 6 insertions(+), 6 deletions(-) > + > +diff --git a/dnf5-plugins/config-manager_plugin/addrepo.cpp > b/dnf5-plugins/config-manager_plugin/addrepo.cpp > +index 18437be2..6ee99338 100644 > +--- a/dnf5-plugins/config-manager_plugin/addrepo.cpp > ++++ b/dnf5-plugins/config-manager_plugin/addrepo.cpp > +@@ -163,7 +163,7 @@ void ConfigManagerAddRepoCommand::set_argument_parser() { > + [[maybe_unused]] > cli::ArgumentParser::NamedArg * arg, > + [[maybe_unused]] const char * option, > + const char * value) { > +- auto val = strchr(value + 1, '='); > ++ const auto * const val = strchr(value + 1, '='); > + if (!val) { > + throw cli::ArgumentParserError( > + M_("{}: Badly formatted argument value \"{}\""), > std::string{"set"}, std::string{value}); > +diff --git a/dnf5-plugins/config-manager_plugin/setopt.cpp > b/dnf5-plugins/config-manager_plugin/setopt.cpp > +index 97fe89d7..973431e2 100644 > +--- a/dnf5-plugins/config-manager_plugin/setopt.cpp > ++++ b/dnf5-plugins/config-manager_plugin/setopt.cpp > +@@ -77,7 +77,7 @@ void ConfigManagerSetOptCommand::set_argument_parser() { > + const char * const argv[]) { > + for (int i = 0; i < argc; ++i) { > + auto value = argv[i]; > +- auto val = strchr(value + 1, '='); > ++ const auto * const val = strchr(value + 1, '='); > + if (!val) { > + throw cli::ArgumentParserError( > + M_("{}: Badly formatted argument value \"{}\""), > std::string{"optval"}, std::string{value}); > +diff --git a/dnf5-plugins/config-manager_plugin/setvar.cpp > b/dnf5-plugins/config-manager_plugin/setvar.cpp > +index d6361642..62722b5f 100644 > +--- a/dnf5-plugins/config-manager_plugin/setvar.cpp > ++++ b/dnf5-plugins/config-manager_plugin/setvar.cpp > +@@ -43,7 +43,7 @@ void ConfigManagerSetVarCommand::set_argument_parser() { > + [this, &ctx]([[maybe_unused]] cli::ArgumentParser::PositionalArg * > arg, int argc, const char * const argv[]) { > + for (int i = 0; i < argc; ++i) { > + auto value = argv[i]; > +- auto val = strchr(value + 1, '='); > ++ const auto * const val = strchr(value + 1, '='); > + if (!val) { > + throw cli::ArgumentParserError( > + M_("{}: Badly formatted argument value \"{}\""), > std::string{"varval"}, std::string{value}); > +diff --git a/dnf5/main.cpp b/dnf5/main.cpp > +index 9f102b26..f51b8094 100644 > +--- a/dnf5/main.cpp > ++++ b/dnf5/main.cpp > +@@ -243,7 +243,7 @@ void RootCommand::set_argument_parser() { > + setopt->set_parse_hook_func( > + [&ctx]( > + [[maybe_unused]] ArgumentParser::NamedArg * arg, > [[maybe_unused]] const char * option, const char * value) { > +- auto val = strchr(value + 1, '='); > ++ const auto * const val = strchr(value + 1, '='); > + if (!val) { > + throw libdnf5::cli::ArgumentParserError( > + M_("{}: Badly formatted argument value \"{}\""), > std::string{"setopt"}, std::string(value)); > +@@ -282,7 +282,7 @@ void RootCommand::set_argument_parser() { > + setvar->set_parse_hook_func( > + [&ctx]( > + [[maybe_unused]] ArgumentParser::NamedArg * arg, > [[maybe_unused]] const char * option, const char * value) { > +- auto val = strchr(value + 1, '='); > ++ const auto * const val = strchr(value + 1, '='); > + if (!val) { > + throw libdnf5::cli::ArgumentParserError( > + M_("{}: Badly formatted argument value \"{}\""), > std::string{"setvar"}, std::string(value)); > +diff --git a/dnf5daemon-client/main.cpp b/dnf5daemon-client/main.cpp > +index 385a32bd..dfd1ee05 100644 > +--- a/dnf5daemon-client/main.cpp > ++++ b/dnf5daemon-client/main.cpp > +@@ -160,7 +160,7 @@ void RootCommand::set_argument_parser() { > + [[maybe_unused]] > libdnf5::cli::ArgumentParser::NamedArg * arg, > + [[maybe_unused]] const char * option, > + const char * value) { > +- auto val = strchr(value + 1, '='); > ++ const auto * const val = strchr(value + 1, '='); > + if (!val) { > + throw std::runtime_error(std::string("setopt: Badly formatted > argument value") + value); > + } > +-- > +2.52.0 > + > diff --git > a/meta/recipes-devtools/dnf/dnf/0006-add-missing-headers-for-musl.patch > b/meta/recipes-devtools/dnf/dnf/0006-add-missing-headers-for-musl.patch > new file mode 100644 > index 0000000000..dbe9304d4d > --- /dev/null > +++ b/meta/recipes-devtools/dnf/dnf/0006-add-missing-headers-for-musl.patch > @@ -0,0 +1,41 @@ > +From dbe4c82deca42b6fc13f5bce01b35c0406a73db2 Mon Sep 17 00:00:00 2001 > +From: Adam Duskett <[email protected]> > +Date: Thu, 27 Nov 2025 11:54:40 +0100 > +Subject: [PATCH] add missing headers for musl > + > +cstdint needs to be implicitly added for musl > + > +Upstream-Status: Backport > [https://github.com/rpm-software-management/dnf5/commit/00e5077e041139fab8ffcabe099b858a9559178c] > +Signed-off-by: Adam Duskett <[email protected]> > +--- > + include/libdnf5-cli/utils/units.hpp | 1 + > + libdnf5-cli/utils/utf8.cpp | 1 + > + 2 files changed, 2 insertions(+) > + > +diff --git a/include/libdnf5-cli/utils/units.hpp > b/include/libdnf5-cli/utils/units.hpp > +index 0ee19fa4..349fbd35 100644 > +--- a/include/libdnf5-cli/utils/units.hpp > ++++ b/include/libdnf5-cli/utils/units.hpp > +@@ -23,6 +23,7 @@ > + > + #include "libdnf5-cli/defs.h" > + > ++#include <cstdint> > + #include <string> > + #include <utility> > + > +diff --git a/libdnf5-cli/utils/utf8.cpp b/libdnf5-cli/utils/utf8.cpp > +index ebeb59f0..d3e0464b 100644 > +--- a/libdnf5-cli/utils/utf8.cpp > ++++ b/libdnf5-cli/utils/utf8.cpp > +@@ -21,6 +21,7 @@ > + #include "utf8.hpp" > + > + #include <clocale> > ++#include <cstdint> > + #include <cstring> > + #include <cwchar> > + > +-- > +2.52.0 > + > diff --git > a/meta/recipes-devtools/dnf/dnf/0007-Define-FNM_EXTMATCH-for-musl.patch > b/meta/recipes-devtools/dnf/dnf/0007-Define-FNM_EXTMATCH-for-musl.patch > new file mode 100644 > index 0000000000..203785a5e1 > --- /dev/null > +++ b/meta/recipes-devtools/dnf/dnf/0007-Define-FNM_EXTMATCH-for-musl.patch > @@ -0,0 +1,36 @@ > +From 8c65576fb01d8a7bbe954dca8e9eb528795e0090 Mon Sep 17 00:00:00 2001 > +From: Adam Duskett <[email protected]> > +Date: Thu, 27 Nov 2025 11:56:23 +0100 > +Subject: [PATCH] Define FNM_EXTMATCH for musl > + > +Fixes the following compilation errors with musl that does not have > +FNM_EXTMATCH defined: > +``` > +error: 'FNM_EXTMATCH' undeclared (first use in this > +function); did you mean 'FNM_NOMATCH'? > +``` > + > +Upstream-Status: Backport > [https://github.com/rpm-software-management/dnf5/commit/3739c4a34db6e7abcd8b4faf0db7d5307f37d340] > +Signed-off-by: Adam Duskett <[email protected]> > +--- > + libdnf5/common/sack/match_string.cpp | 4 ++++ > + 1 file changed, 4 insertions(+) > + > +diff --git a/libdnf5/common/sack/match_string.cpp > b/libdnf5/common/sack/match_string.cpp > +index 78cc4dde..c41894d1 100644 > +--- a/libdnf5/common/sack/match_string.cpp > ++++ b/libdnf5/common/sack/match_string.cpp > +@@ -29,6 +29,10 @@ > + #include <regex> > + #include <stdexcept> > + > ++// TODO: Implement proper FNM_EXTMATCH support to fix MUSL errors. > ++#if !defined(FNM_EXTMATCH) > ++#define FNM_EXTMATCH (0) > ++#endif > + > + namespace libdnf5::sack { > + > +-- > +2.52.0 > + > diff --git > a/meta/recipes-devtools/dnf/dnf/0008-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch > > b/meta/recipes-devtools/dnf/dnf/0008-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch > new file mode 100644 > index 0000000000..213382a4df > --- /dev/null > +++ > b/meta/recipes-devtools/dnf/dnf/0008-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch > @@ -0,0 +1,59 @@ > +From 32e926c627a3d0e81ce14890464abc5e5be74558 Mon Sep 17 00:00:00 2001 > +From: Adam Duskett <[email protected]> > +Date: Thu, 27 Nov 2025 11:48:43 +0100 > +Subject: [PATCH] libdnf: fix arm arch mapping issues for qemuarmv5 > + > +We change the way rpm architectures work, we make the machine name the > default > +machine specific package architecture. > + > +This arm mapping code can work or in the case of qemuarmv5, it doesn't as it > +creates armv5hl which doesn't exist and causes errrors. We can simply remove > +it, we don't need it. > + > +Upstream-Status: Inappropriate [oe-core specific] > +Signed-off-by: Richard Purdie <[email protected]> > + > +Rebased for 5.3.0.0 > +Signed-off-by: Adam Duskett <[email protected]> > +--- > + libdnf5/utils/system.cpp | 24 ------------------------ > + 1 file changed, 24 deletions(-) > + > +diff --git a/libdnf5/utils/system.cpp b/libdnf5/utils/system.cpp > +index ecdc57e..35d8801 100644 > +--- a/libdnf5/utils/system.cpp > ++++ b/libdnf5/utils/system.cpp > +@@ -52,30 +52,6 @@ std::string detect_arch() { > + throw RuntimeError(M_("Failed to execute uname()")); > + } > + > +- if (!strncmp(un.machine, "armv", 4)) { > +- /* un.machine is armvXE, where X is version number and E is > +- * endianness (b or l); we need to add modifiers such as > +- * h (hardfloat), n (neon). Neon is a requirement of armv8 so > +- * as far as rpm is concerned armv8l is the equivalent of armv7hnl > +- * (or 7hnb) so we don't explicitly add 'n' for 8+ as it's > expected. */ > +- char endian = un.machine[strlen(un.machine) - 1]; > +- char * modifier = un.machine + 5; > +- while (isdigit(*modifier)) /* keep armv7, armv8, armv9, armv10, > armv100, ... */ > +- modifier++; > +- if (getauxval(AT_HWCAP) & HWCAP_ARM_VFP) > +- *modifier++ = 'h'; > +- if ((atoi(un.machine + 4) == 7) && (getauxval(AT_HWCAP) & > HWCAP_ARM_NEON)) > +- *modifier++ = 'n'; > +- *modifier++ = endian; > +- *modifier = 0; > +- } > +-#ifdef __MIPSEL__ > +- // support for little endian MIPS > +- if (!strcmp(un.machine, "mips")) > +- strcpy(un.machine, "mipsel"); > +- else if (!strcmp(un.machine, "mips64")) > +- strcpy(un.machine, "mips64el"); > +-#endif > + return un.machine; > + } > + > +-- > +2.52.0 > + > diff --git > a/meta/recipes-devtools/dnf/dnf/0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch > > b/meta/recipes-devtools/dnf/dnf/0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch > deleted file mode 100644 > index 64ea7874d3..0000000000 > --- > a/meta/recipes-devtools/dnf/dnf/0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch > +++ /dev/null > @@ -1,24 +0,0 @@ > -From d5b154ea69afdcd862299a0b7f255f6ece3686c6 Mon Sep 17 00:00:00 2001 > -From: Alexander Kanavin <[email protected]> > -Date: Fri, 30 Dec 2016 18:29:07 +0200 > -Subject: [PATCH] Do not set PYTHON_INSTALL_DIR by running python > - > -Upstream-Status: Inappropriate [oe-core specific] > -Signed-off-by: Alexander Kanavin <[email protected]> > ---- > - CMakeLists.txt | 2 +- > - 1 file changed, 1 insertion(+), 1 deletion(-) > - > -diff --git a/CMakeLists.txt b/CMakeLists.txt > -index 9e2e9e9e..2056089d 100644 > ---- a/CMakeLists.txt > -+++ b/CMakeLists.txt > -@@ -19,7 +19,7 @@ ELSE () > - MESSAGE (FATAL_ERROR "Invalid PYTHON_DESIRED value: " ${PYTHON_DESIRED}) > - ENDIF() > - > --EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "from sys import stdout; > from sysconfig import get_path; stdout.write(get_path('purelib'))" > OUTPUT_VARIABLE PYTHON_INSTALL_DIR) > -+#EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c "from sys import stdout; > from sysconfig import get_path; stdout.write(get_path('purelib'))" > OUTPUT_VARIABLE PYTHON_INSTALL_DIR) > - MESSAGE(STATUS "Python install dir is ${PYTHON_INSTALL_DIR}") > - > - ADD_SUBDIRECTORY (dnf) > diff --git > a/meta/recipes-devtools/dnf/dnf/0030-Run-python-scripts-using-env.patch > b/meta/recipes-devtools/dnf/dnf/0030-Run-python-scripts-using-env.patch > deleted file mode 100644 > index eb46113f3a..0000000000 > --- a/meta/recipes-devtools/dnf/dnf/0030-Run-python-scripts-using-env.patch > +++ /dev/null > @@ -1,34 +0,0 @@ > -From d3556767b84f3687743fdad0a88af0739d736ea9 Mon Sep 17 00:00:00 2001 > -From: Alexander Kanavin <[email protected]> > -Date: Fri, 30 Dec 2016 18:29:37 +0200 > -Subject: [PATCH] Run python scripts using env > - > -Otherwise the build tools hardcode the python path into them. > - > -Upstream-Status: Inappropriate [oe-core specific] > -Signed-off-by: Alexander Kanavin <[email protected]> > ---- > - bin/dnf-automatic.in | 2 +- > - bin/dnf.in | 2 +- > - 2 files changed, 2 insertions(+), 2 deletions(-) > - > -diff --git a/bin/dnf-automatic.in b/bin/dnf-automatic.in > -index 17e35a05..28827e38 100755 > ---- a/bin/dnf-automatic.in > -+++ b/bin/dnf-automatic.in > -@@ -1,4 +1,4 @@ > --#!@PYTHON_EXECUTABLE@ > -+#!/usr/bin/env python3 > - # dnf-automatic executable. > - # > - # Copyright (C) 2014-2016 Red Hat, Inc. > -diff --git a/bin/dnf.in b/bin/dnf.in > -index 55ceb3f2..e38973c7 100755 > ---- a/bin/dnf.in > -+++ b/bin/dnf.in > -@@ -1,4 +1,4 @@ > --#!@PYTHON_EXECUTABLE@ > -+#!/usr/bin/env python3 > - # The dnf executable script. > - # > - # Copyright (C) 2012-2016 Red Hat, Inc. > diff --git a/meta/recipes-devtools/dnf/dnf_4.24.0.bb > b/meta/recipes-devtools/dnf/dnf_4.24.0.bb > deleted file mode 100644 > index d40b85c4b0..0000000000 > --- a/meta/recipes-devtools/dnf/dnf_4.24.0.bb > +++ /dev/null > @@ -1,96 +0,0 @@ > -SUMMARY = "Package manager forked from Yum, using libsolv as a dependency > resolver" > -DESCRIPTION = "Software package manager that installs, updates, and removes \ > -packages on RPM-based Linux distributions. It automatically computes \ > -dependencies and determines the actions required to install packages." > -HOMEPAGE = "https://github.com/rpm-software-management/dnf" > -LICENSE = "GPL-2.0-only" > -LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ > - > file://PACKAGE-LICENSING;md5=4a0548e303dbc77f067335b4d688e745 \ > - " > - > -SRC_URI = > "git://github.com/rpm-software-management/dnf.git;branch=master;protocol=https > \ > - file://0001-Corretly-install-tmpfiles.d-configuration.patch \ > - > file://0001-Do-not-hardcode-etc-and-systemd-unit-directories.patch \ > - file://0005-Do-not-prepend-installroot-to-logdir.patch \ > - file://0029-Do-not-set-PYTHON_INSTALL_DIR-by-running-python.patch > \ > - file://0030-Run-python-scripts-using-env.patch \ > - file://0001-set-python-path-for-completion_helper.patch \ > - file://0001-lock.py-fix-Exception-handling.patch \ > - " > - > -SRC_URI:append:class-native = " > file://0001-dnf-write-the-log-lock-to-root.patch" > - > -SRCREV = "e47634fbe3565d0580e89ec21adb7c1b308642ce" > -UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+(\.\d+)+)" > - > -inherit cmake gettext bash-completion setuptools3-base systemd > - > -DEPENDS += "libdnf librepo libcomps" > - > -# manpages generation requires http://www.sphinx-doc.org/ > -EXTRA_OECMAKE = " -DWITH_MAN=0 > -DPYTHON_INSTALL_DIR=${PYTHON_SITEPACKAGES_DIR} -DPYTHON_DESIRED=3" > - > -BBCLASSEXTEND = "native nativesdk" > - > -RDEPENDS:${PN} += " \ > - python3-core \ > - python3-codecs \ > - python3-ctypes \ > - python3-netclient \ > - python3-email \ > - python3-threading \ > - python3-logging \ > - python3-fcntl \ > - librepo \ > - python3-shell \ > - libcomps \ > - libdnf \ > - python3-sqlite3 \ > - python3-compression \ > - python3-rpm \ > - python3-json \ > - python3-curses \ > - python3-misc \ > - " > - > -RDEPENDS:${PN}:class-native = "" > - > -RRECOMMENDS:${PN}:class-target += "gnupg" > - > -# Create a symlink called 'dnf' as 'make install' does not do it, but > -# .spec file in dnf source tree does (and then Fedora and dnf documentation > -# says that dnf binary is plain 'dnf'). > -do_install:append() { > - ln -rs ${D}/${bindir}/dnf-3 ${D}/${bindir}/dnf > - ln -rs ${D}/${bindir}/dnf-automatic-3 ${D}/${bindir}/dnf-automatic > -} > - > -# Direct dnf-native to read rpm configuration from our sysroot, not the one > it was compiled in > -do_install:append:class-native() { > - create_wrapper ${D}/${bindir}/dnf \ > - > SEQUOIA_CRYPTO_POLICY=${STAGING_DATADIR_NATIVE}/crypto-policies/back-ends/rpm-sequoia.config > \ > - RPM_CONFIGDIR=${STAGING_LIBDIR_NATIVE}/rpm \ > - RPM_NO_CHROOT_FOR_SCRIPTS=1 > -} > - > -do_install:append:class-nativesdk() { > - create_wrapper ${D}/${bindir}/dnf \ > - RPM_CONFIGDIR=${SDKPATHNATIVE}${libdir_nativesdk}/rpm \ > - RPM_NO_CHROOT_FOR_SCRIPTS=1 > -} > - > -SYSTEMD_SERVICE:${PN} = "dnf-makecache.service dnf-makecache.timer \ > - dnf-automatic.service dnf-automatic.timer \ > - dnf-automatic-download.service > dnf-automatic-download.timer \ > - dnf-automatic-install.service > dnf-automatic-install.timer \ > - dnf-automatic-notifyonly.service > dnf-automatic-notifyonly.timer \ > -" > -SYSTEMD_AUTO_ENABLE ?= "disable" > - > -SKIP_RECIPE[dnf] ?= "${@bb.utils.contains('PACKAGE_CLASSES', 'package_rpm', > '', 'does not build without package_rpm in PACKAGE_CLASSES due disabled rpm > support in libsolv', d)}" > - > -# Packages for testing purposes > -PACKAGES += "${PN}-test-main ${PN}-test-dep" > -ALLOW_EMPTY:${PN}-test-main = "1" > -ALLOW_EMPTY:${PN}-test-dep = "1" > -RRECOMMENDS:${PN}-test-main = "${PN}-test-dep" > diff --git a/meta/recipes-devtools/dnf/dnf_5.3.0.0.bb > b/meta/recipes-devtools/dnf/dnf_5.3.0.0.bb > new file mode 100644 > index 0000000000..560b1f928a > --- /dev/null > +++ b/meta/recipes-devtools/dnf/dnf_5.3.0.0.bb > @@ -0,0 +1,192 @@ > +SUMMARY = "DNF package manager rewritten in C++, using libsolv as a > dependency resolver" > +DESCRIPTION = "\ > + DNF5 is a command-line package manager that automates the process of \ > + installing, upgrading, configuring, and removing computer programs in a \ > + consistent manner. It supports RPM packages, modulemd modules, and comps > \ > + groups and environments. \ > +" > +HOMEPAGE = "https://github.com/rpm-software-management/dnf5" > +BUGTRACKER = "https://github.com/rpm-software-management/dnf5/issues" > +CVE_PRODUCT = "rpm:dnf5 rpm-software-management:dnf5" > +SECTION = "base" > + > +LICENSE = "GPL-2.0-or-later & LGPL-2.1-only" > +LIC_FILES_CHKSUM = "\ > + file://COPYING.md;md5=9733192df318d0f806fd668b92ba0ba6 \ > + file://gpl-2.0.txt;md5=b234ee4d69f5fce4486a80fdaf4a4263 \ > + file://lgpl-2.1.txt;md5=4b54a1fd55a448865a0b32d41598759d \ > +" > + > +DEPENDS = "\ > + fmt \ > + glib-2.0 \ > + json-c \ > + libcomps \ > + libmodulemd \ > + librepo \ > + libsolv \ > + libtoml11 \ > + libxml2 \ > + sqlite3 \ > + util-linux \ > +" > + > +SRC_URI = "\ > + > git://github.com/rpm-software-management/dnf5.git;protocol=https;branch=main;tag=${PV} > \ > + file://0002-cmake-set-CMP0190-to-OLD.patch \ > + file://0003-Do-not-hardcode-system_cachedir.patch \ > + file://0004-add-support-for-gcc-12-and-below.patch \ > + file://0005-fix-string-concatenation-errors-for-musl.patch \ > + file://0006-add-missing-headers-for-musl.patch \ > + file://0007-Define-FNM_EXTMATCH-for-musl.patch \ > + file://0008-libdnf-fix-arm-arch-mapping-issues-for-qemuarmv5.patch \ > +" > +SRC_URI:append:class-native = " > file://0001-Do-not-hardcode-the-systemd-unit-directory.patch" > +SRCREV = "c6a42c2e7e9ee0a04d46e6820a5962925a99b085" > + > +UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+(\.\d+)+)" > + > +inherit bash-completion cmake gettext pkgconfig siteinfo systemd > +inherit_defer ${@bb.utils.contains('PACKAGECONFIG', 'python3', > 'python3targetconfig', '', d)} > + > +PACKAGECONFIG[dnfdaemon-client] = > "-DWITH_DNF5DAEMON_CLIENT=ON,-DWITH_DNF5DAEMON_CLIENT=OFF,sdbus-c++" > +PACKAGECONFIG[dnfdaemon-server] = > "-DWITH_DNF5DAEMON_SERVER=ON,-DWITH_DNF5DAEMON_SERVER=OFF,sdbus-c++" > +PACKAGECONFIG[plugins] = > "-DWITH_DNF5_PLUGINS=ON,-DWITH_DNF5_PLUGINS=OFF,curl sdbus-c++ zlib" > +PACKAGECONFIG[plugin-actions] = > "-DWITH_PLUGIN_ACTIONS=ON,-DWITH_PLUGIN_ACTIONS=OFF" > +PACKAGECONFIG[plugin-appstream] = > "-DWITH_PLUGIN_APPSTREAM=ON,-DWITH_PLUGIN_APPSTREAM=OFF,appstream" > +PACKAGECONFIG[plugin-expired-pgp-keys] = > "-DWITH_PLUGIN_EXPIRED_PGP_KEYS=ON,-DWITH_PLUGIN_EXPIRED_PGP_KEYS=OFF,gnupg" > +PACKAGECONFIG[plugin-local] = > "-DWITH_PLUGIN_LOCAL=ON,-DWITH_PLUGIN_LOCAL=OFF" > + > +# sdbus-c++ and journalctl integration. > +PACKAGECONFIG[systemd] = "-DWITH_SYSTEMD=ON,-DWITH_SYSTEMD=OFF,sdbus-c++" > + > +# build options - bindings > +PACKAGECONFIG[python3] = "-DWITH_PYTHON3=ON,-DWITH_PYTHON3=OFF,python3 > swig-native" > + > +# No sdbus-c++-native package. > +PACKAGECONFIG:remove:class-native = "\ > + dnfdaemon-client \ > + dnfdaemon-server \ > + plugins \ > + plugin-manifest \ > + systemd \ > +" > + > +PACKAGE_BEFORE_PN += "\ > + ${PN}-dnfdaemon-server \ > + ${PN}-plugins \ > + ${PN}-python3 \ > +" > + > +# manpages generation requires http://www.sphinx-doc.org/ > +EXTRA_OECMAKE:append = " \ > + -DENABLE_SOLV_FOCUSNEW=ON \ > + -DWITH_DNF5_OBSOLETES_DNF=OFF \ > + -DWITH_DNF5=ON \ > + -DWITH_GO=OFF \ > + -DWITH_HTML=OFF \ > + -DWITH_LIBDNF5_CLI=ON \ > + -DWITH_MAN=OFF \ > + -DWITH_PERL5=OFF \ > + -DWITH_PLUGIN_RHSM=OFF \ > + -DWITH_RUBY=OFF \ > + -DWITH_TESTS=OFF \ > + -DWITH_PLUGIN_MANIFEST=OFF \ > +" > + > +# No sdbus-c++-native package exists so remove all options that depend on it. > +EXTRA_OECMAKE:append:class-native = " \ > + -DWITH_DNF5DAEMON_CLIENT=OFF \ > + -DWITH_DNF5DAEMON_SERVER=OFF \ > + -DWITH_DNF5_PLUGINS=OFF \ > + -DWITH_PLUGIN_MANIFEST=OFF \ > + -DWITH_SYSTEMD=OFF \ > +" > + > +# Create a symlink called 'dnf' as 'make install' does not do it, but > +# .spec file in dnf source tree does (and then Fedora and dnf documentation > +# says that dnf binary is plain 'dnf'). > +do_install:append() { > + ln -rs ${D}/${bindir}/dnf5 ${D}/${bindir}/dnf > + install -d ${D}${sysconfdir}/dnf > + > + # DNF always installs service files to /usr/lib/systemd, even if > usrmerge is not > + # selected. Also, remove systemd files if systemd isn't selected. > + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'false', 'true', > d)}; then > + rm -rf ${D}${libdir}/systemd > + fi > + > + # Breaks dnf because the builddep plugin is provided in the > + # dnf-plugins-core package which is not available in oe-core. > + rm -f ${D}${datadir}/dnf5/aliases.d/compatibility-plugins.conf > +} > + > +# Direct dnf-native to read rpm configuration from our sysroot, not the one > it was compiled in > +do_install:append:class-native() { > + create_wrapper ${D}/${bindir}/dnf \ > + > SEQUOIA_CRYPTO_POLICY=${STAGING_DATADIR_NATIVE}/crypto-policies/back-ends/rpm-sequoia.config > \ > + RPM_CONFIGDIR=${STAGING_LIBDIR_NATIVE}/rpm \ > + RPM_NO_CHROOT_FOR_SCRIPTS=1 > +} > + > +do_install:append:class-nativesdk() { > + create_wrapper ${D}/${bindir}/dnf \ > + RPM_CONFIGDIR=${SDKPATHNATIVE}${libdir_nativesdk}/rpm \ > + RPM_NO_CHROOT_FOR_SCRIPTS=1 > +} > + > +SYSTEMD_SERVICE:${PN} = "\ > + dnf5-makecache.service \ > + dnf5-makecache.timer \ > +" > + > +SYSTEMD_AUTO_ENABLE ?= "disable" > + > +# Packages for testing purposes > +PACKAGES += "${PN}-test-main ${PN}-test-dep" > + > +FILES:${PN} += "\ > + ${bindir}/dnf* \ > + ${datadir}/dbus-1/system-services/org.rpm.dnf.v0.service \ > + ${datadir}/dnf5 \ > + ${datadir}/polkit-1/actions/org.rpm.dnf* \ > + ${datadir}/polkit-1/rules.d/org.rpm.dnf* \ > + ${libdir}/dnf5 \ > + ${libdir}/libdnf5* \ > + ${sysconfdir}/dnf \ > +" > + > +FILES:${PN}-bash-completion += "\ > + ${datadir}/bash-completion/completions/dnf5 \ > +" > + > +FILES:${PN}-dnfdaemon-server += "\ > + ${systemd_system_unitdir}/dnf5daemon-server.service \ > + ${datadir}/dbus-1/interfaces/org.rpm.dnf* \ > + ${datadir}/dbus-1/system.d/org.rpm.dnf* \ > +" > + > +FILES:${PN}-plugins += "\ > + ${systemd_system_unitdir}/dnf-automatic.service \ > + ${systemd_system_unitdir}/dnf-automatic.timer \ > + ${systemd_system_unitdir}/dnf5-automatic.service \ > + ${systemd_system_unitdir}/dnf5-automatic.timer \ > +" > + > +FILES:${PN}-python3 += "\ > + ${libdir}/${PYTHON_DIR}/site-packages/libdnf* \ > +" > + > +FILES:${PN}-systemd += "\ > + ${systemd_system_unitdir}/dnf5-offline-transaction.service \ > + ${systemd_system_unitdir}/dnf5-offline-transaction-cleanup.service \ > +" > + > +RRECOMMENDS:${PN}:class-target += "bash-completion gnupg" > +RRECOMMENDS:${PN}-test-main = "${PN}-test-dep" > +ALLOW_EMPTY:${PN}-test-main = "1" > +ALLOW_EMPTY:${PN}-test-dep = "1" > + > +SKIP_RECIPE[dnf] ?= "${@bb.utils.contains('PACKAGE_CLASSES', 'package_rpm', > '', 'does not build without package_rpm in PACKAGE_CLASSES due to disabled > rpm support in libsolv', d)}" > + > +BBCLASSEXTEND = "native nativesdk" > -- > 2.52.0 > > > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#227716): https://lists.openembedded.org/g/openembedded-core/message/227716 Mute This Topic: https://lists.openembedded.org/mt/116789903/21656 Group Owner: [email protected] Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
