mirror of
https://github.com/libvirt/libvirt.git
synced 2025-01-24 15:26:40 -06:00
Fix timebomb in LIBVIRT_VERSION_INFO calculation
The way LIBVIRT_VERSION_INFO is calculated has a timebomb that will cause us to accidentally break soname when we change the major version number to a non-zero value ! Given CURRENT:REVISION:AGE, libtool will generate libvirt.so.($CURRENT-$AGE).$AGE.$REVISION We set CURRENT to be MAJOR+MINOR and AGE to $MINOR, so as soon as MAJOR changes to non-zero, we get libvirt.so.1 as the soname, eg 1.3.9 would create libvirt.so.1.3.9 Looks natural but is not ABI compatible with libvirt.so.0.x.y The fix is to set CURRENT to always be exactly the same as AGE. We want to have the major version reflected in the so symlinks though. So then we set AGE to MAJOR*1000+MINOR eg, so 1.3.9 would create libvirt.so.0.1003.9 and libvirt 2.51.3 would create libvirt.so.0.2051.3
This commit is contained in:
parent
bb705e2519
commit
3b0cd660ef
41
configure.ac
41
configure.ac
@ -23,16 +23,55 @@ AM_SILENT_RULES([yes])
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
# First extract pieces from the version number string
|
||||
LIBVIRT_MAJOR_VERSION=`echo $VERSION | awk -F. '{print $1}'`
|
||||
LIBVIRT_MINOR_VERSION=`echo $VERSION | awk -F. '{print $2}'`
|
||||
LIBVIRT_MICRO_VERSION=`echo $VERSION | awk -F. '{print $3}'`
|
||||
LIBVIRT_VERSION=$LIBVIRT_MAJOR_VERSION.$LIBVIRT_MINOR_VERSION.$LIBVIRT_MICRO_VERSION$LIBVIRT_MICRO_VERSION_SUFFIX
|
||||
LIBVIRT_VERSION_INFO=`expr $LIBVIRT_MAJOR_VERSION + $LIBVIRT_MINOR_VERSION`:$LIBVIRT_MICRO_VERSION:$LIBVIRT_MINOR_VERSION
|
||||
LIBVIRT_VERSION_NUMBER=`expr $LIBVIRT_MAJOR_VERSION \* 1000000 + $LIBVIRT_MINOR_VERSION \* 1000 + $LIBVIRT_MICRO_VERSION`
|
||||
|
||||
# In libtool terminology we need to figure out:
|
||||
#
|
||||
# CURRENT
|
||||
# The most recent interface number that this library implements.
|
||||
#
|
||||
# REVISION
|
||||
# The implementation number of the CURRENT interface.
|
||||
#
|
||||
# AGE
|
||||
# The difference between the newest and oldest interfaces that this
|
||||
# library implements.
|
||||
#
|
||||
# In other words, the library implements all the interface numbers
|
||||
# in the range from number `CURRENT - AGE' to `CURRENT'.
|
||||
#
|
||||
# Libtool assigns the soname version from `CURRENT - AGE', and we
|
||||
# don't want that to ever change in libvirt. ie it must always be
|
||||
# zero, to produce libvirt.so.0.
|
||||
#
|
||||
# We would, however, like the libvirt version number reflected
|
||||
# in the so version'd symlinks, and this is based on AGE.REVISION
|
||||
# eg libvirt.so.0.AGE.REVISION
|
||||
#
|
||||
# Assuming we do ever want to break soname version, this can
|
||||
# toggled. But seriously, don't ever touch this.
|
||||
LIBVIRT_SONUM=0
|
||||
|
||||
# The following examples show what libtool will do
|
||||
#
|
||||
# Input: 0.9.14 -> libvirt.so.0.9.14
|
||||
# Input: 1.0.0 -> libvirt.so.0.1000.0
|
||||
# Input: 2.5.8 -> libvirt.so.0.2005.8
|
||||
#
|
||||
AGE=`expr $LIBVIRT_MAJOR_VERSION '*' 1000 + $LIBVIRT_MINOR_VERSION`
|
||||
REVISION=$LIBVIRT_MICRO_VERSION
|
||||
CURRENT=`expr $LIBVIRT_SONUM + $AGE`
|
||||
LIBVIRT_VERSION_INFO=$CURRENT:$REVISION:$AGE
|
||||
|
||||
AC_SUBST([LIBVIRT_MAJOR_VERSION])
|
||||
AC_SUBST([LIBVIRT_MINOR_VERSION])
|
||||
AC_SUBST([LIBVIRT_MICRO_VERSION])
|
||||
AC_SUBST([LIBVIRT_SONUM])
|
||||
AC_SUBST([LIBVIRT_VERSION])
|
||||
AC_SUBST([LIBVIRT_VERSION_INFO])
|
||||
AC_SUBST([LIBVIRT_VERSION_NUMBER])
|
||||
|
Loading…
Reference in New Issue
Block a user