[Development] Tagging private symbols as such

Kevin Kofler kevin.kofler at chello.at
Thu Dec 8 02:02:36 CET 2016


Dmitry Shachnev wrote:
> I also dislike this change. As Lisandro says, we do not want it in Debian
> (because we keep track of versions ourselves in the symbols file, and when
> the versions are in the symbols themselves they are just useless noise for
> us). And as you say, you do not want distributions Qt builds to be ABI
> incompatible with upstream (we also would like to avoid that), so if this
> patch gets applied upstream, we will be in a bad situation.
> 
> I wonder what was the reason for OpenSUSE to have this change — I could
> not find a relevant changelog entry. Why cannot they just rebuild all
> packages using private headers for every Qt release, like we do?

See my replies: RPM tracks symbol versions, but not the actual names, e.g., 
Qt has auto-Provides like:
libQt5Core.so.5()(64bit)
libQt5Core.so.5(Qt_5)(64bit)
libQt5Core.so.5(Qt_5.0)(64bit)
libQt5Core.so.5(Qt_5.1)(64bit)
libQt5Core.so.5(Qt_5.2)(64bit)
libQt5Core.so.5(Qt_5.3)(64bit)
libQt5Core.so.5(Qt_5.4)(64bit)
libQt5Core.so.5(Qt_5.5)(64bit)
libQt5Core.so.5(Qt_5.6)(64bit)
libQt5Core.so.5(Qt_5_PRIVATE_API)(64bit)

The auto-Requires correspond. As you can see, the non-private symbols are 
properly versioned, so if something requires an API introduced in 5.6, it 
will have an auto-Requires on "libQt5Core.so.5(Qt_5.6)(64bit)", and the 
dependency solver will know to drag in qt5-qtbase-5.6.0 or newer in a 
selective update scenario (because the older versions will just not have 
that Provides).

Unfortunately, the private symbols just have a generic 
"libQt5Core.so.5(Qt_5_PRIVATE_API)(64bit)" version, which is completely 
useless. (It is versioned as if the ABI were completely immutable, thus 
effectively unversioned.) So we are left to manually query for stuff 
requiring Qt_5_PRIVATE_API and/or manually add versioned Requires on the 
package. If the symbols instead had a version number, e.g.:
libQt5Core.so.5(Qt_5_6_2_PRIVATE_API)(64bit)
that would automatically ensure the packages drag in Qt 5.6.2 and no other 
version, without having to manually add a:
Requires: qt5-qtbase%{?_isa} = %{_qt5_version}

The difference in implementation compared to the Qt_5.x symbol versions 
would be that the private symbols would of course NOT provide the older 
symbol versions, only the latest one, making it effectively an = dependency 
rather than a >= one.

RPM explicitly does NOT track individual symbols as Debian tooling 
apparently does.

        Kevin Kofler




More information about the Development mailing list