[PATCH util-macros] XORG_GIT_MODULE_VERSION: writes module version in xorg-git-version.h
Gaetan Nadon
memsize at videotron.ca
Wed Apr 21 12:54:39 PDT 2010
On Wed, 2010-04-21 at 16:06 +1000, Peter Hutterer wrote:
> On Mon, Apr 19, 2010 at 10:01:06PM -0400, Gaetan Nadon wrote:
> > On Tue, 2010-04-20 at 10:54 +1000, Peter Hutterer wrote:
> >
> > > On Mon, Apr 19, 2010 at 11:00:08PM +0200, Julien Cristau wrote:
> > > > On Mon, Apr 19, 2010 at 14:52:55 -0400, Gaetan Nadon wrote:
> > > >
> > > > > Generates the git module version according to the "git describe HEAD"
> > > > > If the git module has pending changes, it appends "-dirty" to the version tag
> > > > >
> > > > > Signed-off-by: Gaetan Nadon <memsize at videotron.ca>
> > > > > ---
> > > > > xorg-macros.m4.in | 18 ++++++++++++++++++
> > > > > 1 files changed, 18 insertions(+), 0 deletions(-)
> > > > >
> > > > > diff --git a/xorg-macros.m4.in b/xorg-macros.m4.in
> > > > > index 916b472..efb2e53 100644
> > > > > --- a/xorg-macros.m4.in
> > > > > +++ b/xorg-macros.m4.in
> > > > > @@ -1009,3 +1009,21 @@ mv \$(top_srcdir)/.INSTALL.tmp \$(top_srcdir)/INSTALL) \
> > > > > echo 'util-macros \"pkgdatadir\" from xorg-macros.pc not found: installing possibly empty INSTALL.' >&2)"
> > > > > AC_SUBST([INSTALL_CMD])
> > > > > ]) # XORG_INSTALL
> > > > > +
> > > > > +# XORG_GIT_MODULE_VERSION()
> > > > > +# -------------------------
> > > > > +# Minimum version: 1.8.0
> > > > > +#
> > > > > +# Generates the git module version according to the "git describe HEAD"
> > > > > +# If the git module has pending changes, it appends "-dirty" to the version tag
> > > > > +#
> > > > > +AC_DEFUN([XORG_GIT_MODULE_VERSION], [
> > > > > +GIT_MODULE_VERSION_CMD="VER=\`GIT_DIR=\$(top_srcdir)/.git git describe HEAD 2>/dev/null\`; \
> > > > > +DVER=\`GIT_DIR=\$(top_srcdir)/.git git diff-index HEAD 2>/dev/null\`; \
> > > > > +OUTSTR=\"\#undef XORG_GIT_VERSION\" ; \
> > > > > +OUTFILE=\"xorg-git-version.h\"; \
> > > > > +test -n \"\$\$VER\" && OUTSTR=\"\#define XORG_GIT_VERSION \$\$VER\" && test -n \"\$\$DVER\" && OUTSTR=\"\#define XORG_GIT_VERSION \$\$VER-dirty\"; \
> > > > > +test -e \"\$\$OUTFILE\" || echo \"\$\$OUTSTR\" > \"\$\$OUTFILE\"; \
> > > > > +CONTENT=\`cat \$\$OUTFILE\` && test \"\$\$CONTENT\" = \"\$\$OUTSTR\" || echo \$\$OUTSTR > \$\$OUTFILE;"
> > > > > +AC_SUBST([GIT_MODULE_VERSION_CMD])
> > > > > +]) # XORG_GIT_MODULE_VERSION
> > >
> > > my eyes!
> > >
> > > > As I said in reply to the initial patch by Peter I'd like a way to
> > > > disable this, because packages might be built from a git tree, which
> > > > might be unrelated to the xorg one, or outside of any git tree. What's
> > > > the output like if not building from git? Does 'make
> > > > GIT_MODULE_VERSION_CMD=:' work to disable it (I guess not, because
> > > > anything trying to include xorg-git-version.h will be unhappy)?
> > >
> > > it simply sets the #undef and nothing will be printed to the log file. Is
> > > there any specific argument against _running_ the macro as long if it
> > > doesn't add anything to the logfile?
> > >
> > > Gaetan:
> > > I'm not a big fan of the -dirty either but I guess if others want it we can
> > > leave it in. Two questions though:
> >
> > If you remotely help someone debugging a problem, you would like to know
> > if tag/commit is really the code he is running or if there are local
> > changes. With the commit number you can cross-reference the master repo
> > and detect unpsuhed local commits. With the -dirty (now called
> > -with-uncommitted-changes) you now the code is tainted with local
> > changes you know nothing about. It's just additional info.
>
> I really hope that when I help someone debugging they'd tell me beforehand
> if they have local changes. in which case the dirty doesn't help much anyway
> because you still don't know what the changes do.
> but yeah, doesn't matter either way, I'm fine with it.
>
> > > - If modules start using this macro, do they stillhave to add to
> > > DISTCLEANFILES and friends?
> > > - This macro only gets invoked on automake runs, right? So if I pull and
> > > just rebuild, would it update the git version?
> > >
> >
> > All options are available in the Makefile.am regarding the invocation of
> > the macro (or your original script). I have not paid attention to that,
> > it looks you had it covered. The problem domain is similar to ChangeLog.
> > You need a trigger when a new commit is available, but the best we could
> > do is a dist hook. And you may not be running off git. What use case was
> > this feature designed for?
>
> If someone follows git and files a bug (or sends the log) it'll be easy to
> see which commit they have locally. So questions like "do you have commit
> 1234deadbeef in your local repo" aren't needed, reducing the turnaround
> time.
>
> > One suggested a dependency on a git file that changes with the HEAD
> > commit, don't recall what the objections were. I'll think about it some
> > more.
>
> Acked-by: Peter Hutterer <peter.hutterer at who-t.net> for version 2 but please
> make sure that someone else acks it too, automake stuff gives me the creeps.
>
> would also be good checking through Matthias' script from radeonhd for any
> obvious use-cases that this patch doesn't cover. It certainly seems more
> complex.
>
Same purpose, more features and bullet proof. Has been in use > 3 years.
Dan later suggested to distribute a script rather than embed it in a
macro. The radeonhd would be the one to distribute. It has a separate
makefile.am as well.
http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/tree/git_version.sh
http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/tree/RadeonHD.am
We could use the same mechanism as for the INSTALL_CMD to obtain a copy.
Sample output:
/*
* Basic versioning gathered from the git repository.
* Automatically generated by ./git_version.sh.
*/
#ifndef GIT_VERSION_H
#define GIT_VERSION_H 1
/* whether this is a dist tarball or not */
#undef GIT_IS_DIST
/* No errors occured while running git */
#undef GIT_ERRORS
/* git utilities found */
#undef GIT_NOT_FOUND
#define GIT_VERSION "git version 1.6.0.4"
/* The following helps debug why we sometimes do not find ".git/":
* abs_repo_dir="/home/nadon/xorg/src/driver/xf86-video-radeonhd/.git" (should be "/path/to/.git")
* abs_srcdir="/home/nadon/xorg/src/driver/xf86-video-radeonhd" (absolute top source dir "/path/to")
* git_repo_dir=".git" (usually ".git" or "/path/to/.git")
* PWD="/home/nadon/xorg/src/driver/xf86-video-radeonhd"
* srcdir="/home/nadon/xorg/src/driver/xf86-video-radeonhd"
* working_dir="/home/nadon/xorg/src/driver/xf86-video-radeonhd"
*/
/* git repo found */
#define GIT_REPO 1
/* Git SHA ID of last commit */
#define GIT_SHAID "f6c99911"
/* Branch this tree is on */
#define GIT_BRANCH "master"
/* Local changes might be breaking things */
#define GIT_DIRTY 1
/* Define GIT_MESSAGE such that
* printf("%s: built from %s", argv[0], GIT_MESSAGE);
* forms a proper sentence.
*/
#ifdef GIT_DIRTY
# define GIT_DIRTY_MSG " + changes"
#else /* !GIT_DIRTY */
# define GIT_DIRTY_MSG ""
#endif /* GIT_DIRTY */
#ifdef GIT_ERRORS
# define GIT_ERROR_MSG " with error: " GIT_ERRORS
#else /* !GIT_ERRORS */
# define GIT_ERROR_MSG ""
#endif /* GIT_ERRORS */
#ifdef GIT_IS_DIST
# define GIT_DIST_MSG "dist of "
#else /* !GIT_IS_DIST */
# define GIT_DIST_MSG ""
#endif /* GIT_IS_DIST */
#ifdef GIT_REPO
# ifdef GIT_NOT_FOUND
# define GIT_MESSAGE GIT_DIST_MSG "git sources without git: " GIT_NOT_FOUND
# else /* !GIT_NOT_FOUND */
# define GIT_MESSAGE \
GIT_DIST_MSG \
"git branch " GIT_BRANCH ", " \
"commit " GIT_SHAID GIT_DIRTY_MSG \
GIT_ERROR_MSG
# endif /* GIT_NOT_FOUND */
#else /* !GIT_REPO */
# define GIT_MESSAGE GIT_DIST_MSG "non-git sources" GIT_ERROR_MSG
#endif /* GIT_REPO */
#endif /* GIT_VERSION_H */
This a sample program on how it might be used:
/* example program demonstrating the use of git_version.sh output */
#include <stdio.h>
#include <string.h>
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
int main(int argc, char *argv[])
{
const char *const idx = strrchr(argv[0], '/');
const char *const prog = (idx)?(idx+1):(argv[0]);
#ifdef PACKAGE_VERSION
printf("%s: version %s, built from %s\n", prog, PACKAGE_VERSION, GIT_MESSAGE);
#elif defined(GIT_MESSAGE)
printf("%s: built from %s\n", prog, GIT_MESSAGE);
#endif
return 0;
}
> Cheers,
> Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20100421/9c6dc831/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part
URL: <http://lists.x.org/archives/xorg-devel/attachments/20100421/9c6dc831/attachment-0001.pgp>
More information about the xorg-devel
mailing list