Use 'git describe' for working builds

When building from an arbitrary commit in the git tree it's useful
for the resulting packages to be uniquely identifiable.  Therefore,
the build system has been updated to detect if your compiling in
git tree.

If you are building in a git tree, and there are commits after the
last annotated tag.  Then the <id>-<hash> component of 'git describe'
will be used to overwrite the 'Release:' field in the META file.

The only tricky part is that to ensure the 'make dist' tarball is
built using the correct release.  A dist-hook was added to the top
level make file to rewrite the META file using the correct release.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
This commit is contained in:
Brian Behlendorf 2013-03-22 14:46:11 -07:00
parent 09fb1ec48a
commit f6fb7651a0
2 changed files with 28 additions and 10 deletions

View File

@ -33,6 +33,10 @@ distclean-local::
-o -name '*.order' -o -name '*.markers' \) \ -o -name '*.order' -o -name '*.markers' \) \
-type f -print | xargs $(RM) -type f -print | xargs $(RM)
dist-hook:
sed -i 's/Release:[[:print:]]*/Release: $(RELEASE)/' \
$(distdir)/META
ctags: ctags:
$(RM) $(top_srcdir)/tags $(RM) $(top_srcdir)/tags
find $(top_srcdir) -name .git -prune -o -name '*.[hc]' | xargs ctags find $(top_srcdir) -name .git -prune -o -name '*.[hc]' | xargs ctags

View File

@ -1,10 +1,14 @@
dnl # ###############################################################################
dnl # ZFS_AC_META # Written by Chris Dunlap <cdunlap@llnl.gov>.
dnl # Read metadata from the META file. # Modified by Brian Behlendorf <behlendorf1@llnl.gov>.
dnl # ###############################################################################
dnl # AUTHOR: # ZFS_AC_META: Read metadata from the META file. When building from a
dnl # Chris Dunlap <cdunlap@llnl.gov> # git repository the ZFS_META_RELEASE field will be overwritten if there
dnl # # is an annotated tag matching the form ZFS_META_NAME-ZFS_META_VERSION-*.
# This allows for working builds to be uniquely identified using the git
# commit hash.
###############################################################################
AC_DEFUN([ZFS_AC_META], [ AC_DEFUN([ZFS_AC_META], [
AH_BOTTOM([ AH_BOTTOM([
@ -20,9 +24,9 @@ AC_DEFUN([ZFS_AC_META], [
AC_MSG_CHECKING([metadata]) AC_MSG_CHECKING([metadata])
META="$srcdir/META" META="$srcdir/META"
_zfs_ac_meta_got_file=no _zfs_ac_meta_type="none"
if test -f "$META"; then if test -f "$META"; then
_zfs_ac_meta_got_file=yes _zfs_ac_meta_type="META file"
ZFS_META_NAME=_ZFS_AC_META_GETVAL([(?:NAME|PROJECT|PACKAGE)]); ZFS_META_NAME=_ZFS_AC_META_GETVAL([(?:NAME|PROJECT|PACKAGE)]);
if test -n "$ZFS_META_NAME"; then if test -n "$ZFS_META_NAME"; then
@ -41,6 +45,16 @@ AC_DEFUN([ZFS_AC_META], [
fi fi
ZFS_META_RELEASE=_ZFS_AC_META_GETVAL([RELEASE]); ZFS_META_RELEASE=_ZFS_AC_META_GETVAL([RELEASE]);
if git rev-parse --git-dir > /dev/null 2>&1; then
_match="${ZFS_META_NAME}-${ZFS_META_VERSION}*"
_alias=$(git describe --match=${_match} 2>/dev/null)
_release=$(echo ${_alias}|cut -f3- -d'-'|sed 's/-/_/g')
if test -n "${_release}"; then
ZFS_META_RELEASE=${_release}
_zfs_ac_meta_type="git describe"
fi
fi
if test -n "$ZFS_META_RELEASE"; then if test -n "$ZFS_META_RELEASE"; then
AC_DEFINE_UNQUOTED([ZFS_META_RELEASE], ["$ZFS_META_RELEASE"], AC_DEFINE_UNQUOTED([ZFS_META_RELEASE], ["$ZFS_META_RELEASE"],
[Define the project release.] [Define the project release.]
@ -116,7 +130,7 @@ AC_DEFUN([ZFS_AC_META], [
fi fi
fi fi
AC_MSG_RESULT([$_zfs_ac_meta_got_file]) AC_MSG_RESULT([$_zfs_ac_meta_type])
] ]
) )