#!/bin/sh set -eu SOURCE_DIR=$1 MAJOR=$2 MINOR=$3 PATCH=$4 VER="$MAJOR.$MINOR.$PATCH" update() { file="$SOURCE_DIR/$1" expr="$2" sed -e "$expr" "$file" > "$file.updated-version" if diff "$file" "$file.updated-version"; then rm "$file.updated-version" else # use cat > and rm instead of move to keep file permissions cat "$file.updated-version" > "$file" rm "$file.updated-version" fi } update 'configure.ac' 's/AC_INIT(\[tox\], \[.*\])/AC_INIT([tox], ['$VER'])/' update 'toxcore/tox.api.h' 's/\(const VERSION_MAJOR *= \).*;/\1'$MAJOR';/' update 'toxcore/tox.api.h' 's/\(const VERSION_MINOR *= \).*;/\1'$MINOR';/' update 'toxcore/tox.api.h' 's/\(const VERSION_PATCH *= \).*;/\1'$PATCH';/' # # calculating the SO version # # The SO version reflects changes in the ABI compatibility of the libary [1]. # The general convention on this is that the SO version is a monotonically # increasing number. The major version reflects breaking changes and the minor # number reflect non-breaking updates [2]. # # The SO version for tox libraries consists of two parts: `A.B`. # - incrementing A reflects an ABI breaking change. # - incrementing B reflects a non-ABI-breaking update. B is set to 0 when A is incremented. # # As the tox versioning scheme directly reflects ABI compatibility, we can use it # to construct the SO version. # # In the `0.y.z` release cycle, breaking changes are allowed in every increment of `y`, # so we can build the SO version just by taking `y.z`. # In the `x.y.z` release cycle with `x > 0` the SO version must be calculated by taking # the major of the tox version and add a hardcoded number that is the last A of the 0.y.z # release cycle. # # References: # # [1]: https://autotools.io/libtool/version.html # [2]: http://www.ibm.com/developerworks/linux/library/l-shlibs/index.html#N1006E # # the last major version number from the 0.x release cycle # this must be constant starting from the 1.0 release LAST_SOMAJOR=1 if [ $MAJOR -eq 0 ]; then SOMAJOR=$MINOR SOMINOR=$PATCH # update lastmajor above update 'other/version-sync' 's/^\(LAST_SOMAJOR=\).*/\1'$SOMAJOR'/' else SOMAJOR=$(expr $MAJOR + $LAST_SOMAJOR) SOMINOR=$MINOR fi # # libtool has a quite cryptic implementation of the versioning system, which also # changes between systems, see https://github.com/lxde/lxqt/issues/488#issuecomment-238084222 # # .so library version, following the libtool scheme: # # current:revision:age # # current: increment if interfaces have been added, removed or changed # revision: increment if source code has changed, set to zero if current is # incremented # age: increment if interfaces have been added, set to zero if # interfaces have been removed or changed # # For a full reference see: # https://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info # # Passing such a version string to libtool will generate the following version number # on the libary binary file on GNU/Linux: # # (current - age).(age).(revision) # # We do not want to use a separate version numbering for the library because the package versioning is equally good: # # Semver non-breaking: 0.y.(z+1) or x.(y+1).0: # # This would mean to increment current and age, which leave the major of SOVERSION the same. # Revision is incremented. # # Semver breaking: 0.(y+1).0 or (x+1).0.0: # # This would mean to increment current, set age and revision to zero. # # Thus to make libtool use our version, we have to pass (major + minor):patch:minor as current:revision:age to get: # # (current - age).(age).(revision) # <=> (major + minor - minor).minor.patch # <=> major.minor.patch # if [ $MAJOR -eq 0 ]; then LIBTOOL_CURRENT=$(expr $SOMAJOR + $SOMINOR) LIBTOOL_AGE=$SOMINOR LIBTOOL_REVISION=0 else LIBTOOL_CURRENT=$(expr $SOMAJOR + $SOMINOR) LIBTOOL_AGE=$SOMINOR LIBTOOL_REVISION=$PATCH fi update 'so.version' 's/^\(CURRENT=\).*/\1'$LIBTOOL_CURRENT'/' update 'so.version' 's/^\(AGE=\).*/\1'$LIBTOOL_AGE'/' update 'so.version' 's/^\(REVISION=\).*/\1'$LIBTOOL_REVISION'/'