diff options
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | include/tinyalsa/version.h | 21 | ||||
-rw-r--r-- | meson.build | 2 | ||||
-rwxr-xr-x | scripts/travis-build.sh | 4 | ||||
-rwxr-xr-x | scripts/version.py | 25 | ||||
-rwxr-xr-x | scripts/version.sh | 264 | ||||
-rw-r--r-- | src/Makefile | 23 |
7 files changed, 305 insertions, 39 deletions
@@ -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 |