diff --git a/.gitignore b/.gitignore
index 8cc61c8..58387c9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
# generated by autotools
-build-aux/
+build-aux/*
+!build-aux/vergen
aclocal.m4
autom4te.cache
configure
diff --git a/build-aux/vergen b/build-aux/vergen
new file mode 100755
index 0000000..9aba0ea
--- /dev/null
+++ b/build-aux/vergen
@@ -0,0 +1,38 @@
+#!/bin/sh
+# Generates version string
+#
+# Copyright (C) 2012, 2013, 2014 Free Software Foundation, Inc.
+#
+# This file is part of GNU ease.js.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+##
+
+# for distributions
+if [ -s version ]; then
+ cat version
+ exit
+fi
+
+git rev-parse --show-toplevel >/dev/null 2>&1 || {
+ echo 'fatal: git repository is not available'
+}
+
+version="$( git describe --match='[0-9]\.*' --abbrev=7 HEAD 2>/dev/null )"
+git update-index -q --refresh
+verstr="${version:-0.0.0}"
+test -z "$( git diff-index --name-only HEAD)" || verstr="$verstr-dirty"
+
+echo -n "$verstr"
+
diff --git a/configure.ac b/configure.ac
index 2d45687..7ddb663 100644
--- a/configure.ac
+++ b/configure.ac
@@ -18,10 +18,26 @@
# along with this program. If not, see .
##
-AC_INIT([shspec], [0.0.1-dev], [mtg@gnu.org])
+# version string is dynamically generated
+m4_define([ver], m4_esyscmd(build-aux/vergen))
+m4_if(ver, [], [m4_exit(1)])
+
+AC_INIT([shspec], [ver], [mtg@gnu.org])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([foreign])
+# provide more granular version numbers based on the version string, using
+# the format MAJOR.MINOR.REV[-SUFFIX], where SUFFIX can itself contain
+# dashes (and often will)
+m4_define([ver_split],
+ m4_split(
+ patsubst(AC_PACKAGE_VERSION, [^\([^-]+\)-], [\1.]),
+ [\.]))
+AC_SUBST(MAJOR, m4_argn(1, ver_split))
+AC_SUBST(MINOR, m4_argn(2, ver_split))
+AC_SUBST(REV, m4_argn(3, ver_split))
+AC_SUBST(SUFFIX, m4_argn(4, ver_split))
+
AC_CHECK_PROGS(XXD, [xxd])
test "$XXD" || AC_MSG_ERROR([missing xxd])