aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTaylor Holberton <tay10r@protonmail.com>2019-04-13 23:14:34 -0400
committerGitHub <noreply@github.com>2019-04-13 23:14:34 -0400
commit1d2302a566935bf213f4f110a7f98c8f8a655d07 (patch)
tree33e7f868a859786b89a64d8372016d063b3f015f
parent4ea3cdf179e01e3d462b6f5d51ed0e07215766f0 (diff)
parent1830893d7b0c43e53da0e4c50449cf7826101614 (diff)
Merge pull request #128 from alexonea/master
Easier Version Specification
-rw-r--r--Makefile5
-rw-r--r--include/tinyalsa/version.h21
-rw-r--r--meson.build2
-rwxr-xr-xscripts/travis-build.sh4
-rwxr-xr-xscripts/version.py25
-rwxr-xr-xscripts/version.sh264
-rw-r--r--src/Makefile23
7 files changed, 305 insertions, 39 deletions
diff --git a/Makefile b/Makefile
index e3ed0ef..9c3dcb1 100644
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,11 @@ export LIBDIR ?= $(PREFIX)/lib
export BINDIR ?= $(PREFIX)/bin
export MANDIR ?= $(PREFIX)/share/man
+export VERSIONSCRIPT = $(shell pwd)/scripts/version.sh
+
+export TINYALSA_VERSION_MAJOR = $(shell $(VERSIONSCRIPT) -s print major)
+export TINYALSA_VERSION = $(shell $(VERSIONSCRIPT) -s print )
+
.PHONY: all
all:
$(MAKE) -C src
diff --git a/include/tinyalsa/version.h b/include/tinyalsa/version.h
index ae3fb5e..608511d 100644
--- a/include/tinyalsa/version.h
+++ b/include/tinyalsa/version.h
@@ -29,15 +29,30 @@
#ifndef TINYALSA_VERSION_H
#define TINYALSA_VERSION_H
+/* Macros for expanding the version numbers into string literals */
+#define TINYALSA_VERSION_STR_EX(number) #number
+#define TINYALSA_VERSION_STR(number) TINYALSA_VERSION_STR_EX (number)
+
#define TINYALSA_VERSION_MAJOR 1
#define TINYALSA_VERSION_MINOR 1
#define TINYALSA_VERSION_PATCH 1
-#define TINYALSA_VERSION 0x010101UL
-
-#define TINYALSA_VERSION_STRING "1.1.1"
+/* The final version number is constructed based on minor, major and patch */
+#define TINYALSA_VERSION \
+ ((unsigned long) \
+ ((TINYALSA_VERSION_MAJOR << 16) | \
+ (TINYALSA_VERSION_MINOR << 8 ) | \
+ (TINYALSA_VERSION_PATCH )))
+
+/* The version string is constructed by concatenating individual ver. strings */
+#define TINYALSA_VERSION_STRING \
+ TINYALSA_VERSION_STR (TINYALSA_VERSION_MAJOR) \
+ "." \
+ TINYALSA_VERSION_STR (TINYALSA_VERSION_MINOR) \
+ "." \
+ TINYALSA_VERSION_STR (TINYALSA_VERSION_PATCH)
#endif /* TINYALSA_VERSION_H */
diff --git a/meson.build b/meson.build
index d7e3a99..abbca8e 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
project ('tinyalsa', 'c',
- version : run_command(find_program('scripts/version.py')).stdout().strip(),
+ version : run_command(find_program('scripts/version.sh'), 'print', '-s').stdout().strip(),
meson_version : '>= 0.48.0')
tinyalsa_includes = include_directories('.', 'include')
diff --git a/scripts/travis-build.sh b/scripts/travis-build.sh
index 9639d88..2bfc4d2 100755
--- a/scripts/travis-build.sh
+++ b/scripts/travis-build.sh
@@ -3,6 +3,8 @@
set -e
set -u
+ROOT=$(pwd)
+
make
make clean
@@ -16,3 +18,5 @@ $HOME/.local/bin/meson . meson-build
cd meson-build
ninja
cd ..
+
+${ROOT}/scripts/version.sh check
diff --git a/scripts/version.py b/scripts/version.py
deleted file mode 100755
index 892dbdb..0000000
--- a/scripts/version.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python3
-#
-# tinyalsa version.py: Extracts versions from TINYALSA_VERSION_STRING in
-# include/tinyalsa/version.h header file for Meson build.
-import os
-import sys
-
-if __name__ == '__main__':
- try:
- srcroot = os.environ['MESON_SOURCE_ROOT']
- except:
- srcroot = os.getcwd()
- print('Warning: MESON_SOURCE_ROOT env var not set, assuming source code is in', srcroot, file=sys.stderr)
-
- # API version
- api_version = None
- f = open(os.path.join(srcroot, 'include', 'tinyalsa', 'version.h'), 'r')
- for line in f:
- if line.startswith('#define TINYALSA_VERSION_STRING '):
- api_version = line[32:].strip().replace('"', '')
- print(api_version)
- sys.exit(0)
-
- print('Warning: Could not extract API version from TINYALSA_VERSION_STRING in include/tinyalsa/version.h in', srcroot, file=sys.stderr)
- sys.exit(-1)
diff --git a/scripts/version.sh b/scripts/version.sh
new file mode 100755
index 0000000..8876c40
--- /dev/null
+++ b/scripts/version.sh
@@ -0,0 +1,264 @@
+#!/usr/bin/env bash
+
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+#
+# Project configuration variables
+#
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+VERSION_FILE="include/tinyalsa/version.h"
+CHANGELOG_FILE="debian/changelog"
+
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+#
+# Scripts internal variables
+#
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+LF="\n"
+PARAMS=""
+DRYRUN=0
+
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+#
+# Helper functions
+#
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+die()
+{
+ echo "Error: $@" 1>&2
+ exit 1
+}
+
+print_usage()
+{
+ echo
+ echo "Usage: $0 [OPTIONS] ACTION"
+ echo
+ echo "Available options:"
+ echo " -s,--script Format output in \"script\" mode (no trailing newline)."
+ echo " -d,--dry-run Does not commit anything to any file, just prints."
+ echo
+ echo "Available actions:"
+ echo " print [minor|major|patch] Print the current version."
+ echo " release [minor|major|patch] Bump the specified version part"
+ echo " check Check the changelog latest released"
+ echo " version against the version file."
+ echo
+ echo "Please run this script from the project root folder."
+ echo
+}
+
+check_files()
+{
+ [ -f ${VERSION_FILE} ] || die "No ${VERSION_FILE} found!";
+ [ -f ${CHANGELOG_FILE} ] || die "No ${CHANGELOG_FILE} found!"
+}
+
+# Gets a part of the version from the project version file (version.h).
+# Takes one argument: the matching version identifier in the version file, e.g.
+# TINYALSA_VERSION_MAJOR
+get_version_part()
+{
+ local V=$(grep -m 1 "^#define\([ \t]*\)$1" ${VERSION_FILE} | sed 's/[^0-9]*//g')
+
+ if [ -z ${V} ]; then
+ die "Could not get $1 from ${VERSION_FILE}"
+ fi
+
+ echo ${V}
+}
+
+
+# Gets the complete version from the version file.
+# Sets VERSION_MAJOR, VERSION_MINOR and VERSION_PATCH globals
+get_version()
+{
+ VERSION_MAJOR=$(get_version_part "TINYALSA_VERSION_MAJOR")
+ VERSION_MINOR=$(get_version_part "TINYALSA_VERSION_MINOR")
+ VERSION_PATCH=$(get_version_part "TINYALSA_VERSION_PATCH")
+}
+
+# Commits the new version part to the version file.
+# Takes two arguments: the version part identifier in the version file and the
+# new version number. If no arguments, do nothing.
+commit_version_part()
+{
+ if [ -z $1 ] || [ -z $2 ]; then
+ return 0
+ fi
+
+ sed -i "s/\(^#define[ \t]*$1\)[ \t]*\([0-9]*\)/\1 $2/g" ${VERSION_FILE} \
+ || die "Could not commit version for $1";
+
+ [ $(get_version_part $1) = "$2" ] || die "Version check after commit failed for $1"
+
+ return 0;
+}
+
+# Commits the new version to the version file.
+# Takes three arguments, the new version numbers for major, minor and patch
+commit_version()
+{
+ commit_version_part "TINYALSA_VERSION_PATCH" $1
+ commit_version_part "TINYALSA_VERSION_MINOR" $2
+ commit_version_part "TINYALSA_VERSION_MAJOR" $3
+
+ return 0
+}
+
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+#
+# Actions implementations / functions
+#
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+print_version()
+{
+ if [ -z $1 ]; then
+ printf "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${LF}"
+ else
+ case "$1" in
+ major)
+ printf "${VERSION_MAJOR}${LF}"
+ ;;
+ minor)
+ printf "${VERSION_MINOR}${LF}"
+ ;;
+ patch)
+ printf "${VERSION_PATCH}${LF}"
+ ;;
+ *)
+ die "Unknown part \"$1\" (must be one of minor, major and patch)."
+ ;;
+ esac
+ fi
+
+ return 0
+}
+
+bump_version()
+{
+ local PART="patch"
+
+ if [ ! -z $1 ]; then
+ PART="$1"
+ fi
+
+ case "$PART" in
+ major)
+ VERSION_MAJOR=$((VERSION_MAJOR+1))
+ VERSION_MINOR=0
+ VERSION_PATCH=0
+ ;;
+ minor)
+ VERSION_MINOR=$((VERSION_MINOR+1))
+ VERSION_PATCH=0
+ ;;
+ patch)
+ VERSION_PATCH=$((VERSION_PATCH+1))
+ ;;
+ *)
+ die "Unknown part \"$1\" (must be one of minor, major and patch)."
+ ;;
+ esac
+
+ if [ ${DRYRUN} -ne 1 ]; then
+ commit_version ${VERSION_PATCH} ${VERSION_MINOR} ${VERSION_MAJOR}
+ fi
+
+ print_version
+ return 0
+}
+
+check_version()
+{
+ local LOG_VERSION=$(grep -m 1 "^tinyalsa (" ${CHANGELOG_FILE}| sed "s/[^0-9.]*//g")
+ local REF_VERSION="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"
+
+ if [ "${LOG_VERSION}" != "${REF_VERSION}" ]; then
+ die "Changelog version (${LOG_VERSION}) does not match package version (${REF_VERSION})."
+ fi
+
+ printf "Changelog version (${LOG_VERSION}) OK!${LF}"
+ return 0
+}
+
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+#
+# Command Line parsing
+#
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+parse_command()
+{
+ if [ "$#" -eq "0" ]; then
+ print_usage
+ exit 1
+ fi
+
+ case "$1" in
+ print)
+ get_version
+ print_version "$2"
+ exit $?
+ ;;
+ release)
+ get_version
+ bump_version "$2"
+ exit $?
+ ;;
+ check)
+ get_version
+ check_version
+ exit $?
+ ;;
+ *)
+ die "Unsupported action \"$1\"."
+ ;;
+ esac
+}
+
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+#
+# Main
+#
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+set -e
+trap "set +e" 0
+
+# Checking parameters
+if [ "$#" -eq "0" ]; then
+ print_usage
+ exit 0
+fi
+
+while [ "$#" -ne "0" ]; do
+ case "$1" in
+ -s|--script)
+ unset LF
+ shift
+ ;;
+ -d|--dry-run)
+ DRYRUN=1
+ shift
+ ;;
+ --)
+ shift
+ break
+ ;;
+ -*|--*=)
+ die "Unsupported flag \"$1\"."
+ ;;
+ *)
+ PARAMS="$PARAMS ${1}"
+ shift
+ ;;
+ esac
+done
+
+# set positional arguments in their proper place
+set -- "${PARAMS}"
+
+check_files
+parse_command ${PARAMS}
+
+# The script should never reach this place.
+die "Internal error. Please report this."
diff --git a/src/Makefile b/src/Makefile
index d33c9f1..fde31e4 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -18,6 +18,9 @@ override CFLAGS := $(WARNINGS) $(INCLUDE_DIRS) -fPIC $(CFLAGS)
VPATH = ../include/tinyalsa
OBJECTS = limits.o mixer.o pcm.o
+LIBVERSION_MAJOR = $(TINYALSA_VERSION_MAJOR)
+LIBVERSION = $(TINYALSA_VERSION)
+
.PHONY: all
all: libtinyalsa.a libtinyalsa.so
@@ -30,28 +33,28 @@ mixer.o: mixer.c mixer.h
libtinyalsa.a: $(OBJECTS)
$(AR) $(ARFLAGS) $@ $^
-libtinyalsa.so: libtinyalsa.so.1
+libtinyalsa.so: libtinyalsa.so.$(LIBVERSION_MAJOR)
ln -sf $< $@
-libtinyalsa.so.1: libtinyalsa.so.1.1.1
+libtinyalsa.so.$(LIBVERSION_MAJOR): libtinyalsa.so.$(LIBVERSION)
ln -sf $< $@
-libtinyalsa.so.1.1.1: $(OBJECTS)
- $(LD) $(LDFLAGS) -shared -Wl,-soname,libtinyalsa.so.1 $^ -o $@
+libtinyalsa.so.$(LIBVERSION): $(OBJECTS)
+ $(LD) $(LDFLAGS) -shared -Wl,-soname,libtinyalsa.so.$(LIBVERSION_MAJOR) $^ -o $@
.PHONY: clean
clean:
rm -f libtinyalsa.a
rm -f libtinyalsa.so
- rm -f libtinyalsa.so.1
- rm -f libtinyalsa.so.1.1.1
+ rm -f libtinyalsa.so.$(LIBVERSION_MAJOR)
+ rm -f libtinyalsa.so.$(LIBVERSION)
rm -f $(OBJECTS)
.PHONY: install
-install: libtinyalsa.a libtinyalsa.so.1
+install: libtinyalsa.a libtinyalsa.so.$(LIBVERSION_MAJOR)
install -d $(DESTDIR)$(LIBDIR)/
install libtinyalsa.a $(DESTDIR)$(LIBDIR)/
- install libtinyalsa.so.1.1.1 $(DESTDIR)$(LIBDIR)/
- ln -sf libtinyalsa.so.1.1.1 $(DESTDIR)$(LIBDIR)/libtinyalsa.so.1
- ln -sf libtinyalsa.so.1 $(DESTDIR)$(LIBDIR)/libtinyalsa.so
+ install libtinyalsa.so.$(LIBVERSION) $(DESTDIR)$(LIBDIR)/
+ ln -sf libtinyalsa.so.$(LIBVERSION) $(DESTDIR)$(LIBDIR)/libtinyalsa.so.$(LIBVERSION_MAJOR)
+ ln -sf libtinyalsa.so.$(LIBVERSION_MAJOR) $(DESTDIR)$(LIBDIR)/libtinyalsa.so