mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
d6047692a5
We're not releasing yet, but projects preparing for the release will want to build against this version in master.
131 lines
4.2 KiB
Bash
Executable File
131 lines
4.2 KiB
Bash
Executable File
#!/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';/'
|
|
|
|
update 'CMakeLists.txt' 's/\(PROJECT_VERSION_MAJOR "\).*"/\1'$MAJOR'"/'
|
|
update 'CMakeLists.txt' 's/\(PROJECT_VERSION_MINOR "\).*"/\1'$MINOR'"/'
|
|
update 'CMakeLists.txt' 's/\(PROJECT_VERSION_PATCH "\).*"/\1'$PATCH'"/'
|
|
|
|
#
|
|
# calculating the SO version
|
|
#
|
|
# The SO version reflects changes in the ABI compatibility of the library [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=2
|
|
|
|
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 library 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'/'
|