[Openembedded-architecture] Changes that switching from smart to dnf will cause

Alexander Kanavin alexander.kanavin at linux.intel.com
Tue Feb 14 14:04:46 UTC 2017


Hello,

I've posted the patchset for replacing the smart package manager with 
dnf package manager to oe-core list, and wanted to write a separate 
email here, laying out what are the changes this will cause and why 
they're necessary or good to have. Please refer to the patchset if you 
want to see implementation details.

1. Smart package manager is replaced by Dnf package manager. Smart has 
become unmaintained upstream, is not ported to Python 3.x and we need to 
find a replacement. Dnf is the only feasible candidate.

The change in functionality is that the on-target package management 
from remote package feeds is now done with a different tool that has a 
different set of command line options. If you have scripts that call the 
tool directly, or use its api (not sure if smart has an api), they need 
to be fixed.

2. Rpm 5.x is replaced with rpm 4.x. This is done for two major reasons:

- DNF is API incompatible with Rpm 5.x and porting it and maintaining 
the port is non-trivial.

- rpm 5.x itself is more or less unmaintained both in the upstream and 
in Yocto. There is no community around it, and Yocto is the sole 
remaining user. I think this is a stronger argument for moving away from 
it, than any technically superior features rpm 5.x may have over 4.x 
(not sure what those would be).

3. Berkeley db 6.x is removed; Berkeley db 5.x becomes default

Version 6.x of Berkeley DB has been rejected by open source community
due to its hostile AGPLv3 license; both Fedora and Debian are sticking 
with db 5.x - and by extension,all the open source projects are still 
developed and tested with db 5.x

In oe-core the only thing that was requiring db 6.x was rpm 5.x, and so
there's no reason to continue carrying db 6.x in oe-core. If someone 
needs API features that are only available in db 6.x, it can be re-added 
to meta-oe.

4. Createrepo is replaced with createrepo_c

createrepo_c is the current incarnation of the tool that generates 
remote repository metadata; it's written in C (createrepo was in 
Python), is faster, and is maintained.

5. architecture-independent .rpm packages are "noarch" instead of "all"

Too many places in dnf/rpm4 stack make that assumption; let's not fight 
against it. It's only about the filenames and the architecture tag in 
them; nothing else has changed in oe-core system, particularly 
allarch.bbclass is untouched.

6. Things that need to run on target during package installation should 
go into pkg_postinst_ontarget()

Previously, the way to achieve this was:

pkg_postinst_PACKAGENAME() {
      if [ x"$D" = "x" ]; then
           # Actions to carry out on the device go here
      else
           exit 1
      fi
}

The new way is simply:

pkg_postinst_ontarget_PACKAGENAME() {
      # Actions to carry out on the device go here
}

The old way still works, but is deprecated and will produce a warning. I 
understand this change is orthogonal to dnf, but the current design is 
flawed and now is a chance to fix it. The reasons are:

1) Code is hard to read; it is not obvious that 'if D is defined then 
exit 1' means 'defer what follows to first boot during package 
cross-install'.

2) Worse, this hides actual errors in the scriptlets; there is no 
difference between scriptlet failing because it's intended to be run on 
target and scriptlet failing because there's a bug or a regression 
somewhere. I've already found broken scriptlets where the brokenness was 
hidden this way (in meta-selftest/recipes-test/postinst/postinst_1.0.bb)

Plain pkg_postinst() without special tricks works exactly as before.

7. There are various rpm-related features that have not been ported over 
yet.

The reason is that they are all disabled by default and don't have a 
test case - I don't want to figure out what they're supposed to do in 
the absence of a clear way to verify them - there's already more than 
enough changes to test and review. Specifically:

- configuring remote package feeds with PACKAGE_FEED_URIS (bug to create 
a test case has been filed)
- signing of remote package feeds using PACKAGE_FEED_SIGN (also has a 
bug to create a test case)
- signing of rpm packages using RPM_SIGN_PACKAGES (this one I will fix 
in the next few days, as I actually did find a testcase)
- RPM_PREFER_ELF_ARCH (have no idea about what this does at all).

... and possibly other features - there's a lot of obscure corners in 
oe-core which I might have missed.

Regards,
Alex



More information about the Openembedded-architecture mailing list