<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.26.0">
</HEAD>
<BODY>
On Wed, 2010-04-21 at 16:06 +1000, Peter Hutterer wrote:
<BLOCKQUOTE TYPE=CITE>
<PRE>
On Mon, Apr 19, 2010 at 10:01:06PM -0400, Gaetan Nadon wrote:
&gt; On Tue, 2010-04-20 at 10:54 +1000, Peter Hutterer wrote:
&gt; 
&gt; &gt; On Mon, Apr 19, 2010 at 11:00:08PM +0200, Julien Cristau wrote:
&gt; &gt; &gt; On Mon, Apr 19, 2010 at 14:52:55 -0400, Gaetan Nadon wrote:
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Generates the git module version according to the &quot;git describe HEAD&quot;
&gt; &gt; &gt; &gt; If the git module has pending changes, it appends &quot;-dirty&quot; to the version tag
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Signed-off-by: Gaetan Nadon &lt;<A HREF="mailto:memsize@videotron.ca">memsize@videotron.ca</A>&gt;
&gt; &gt; &gt; &gt; ---
&gt; &gt; &gt; &gt;  xorg-macros.m4.in |   18 ++++++++++++++++++
&gt; &gt; &gt; &gt;  1 files changed, 18 insertions(+), 0 deletions(-)
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; diff --git a/xorg-macros.m4.in b/xorg-macros.m4.in
&gt; &gt; &gt; &gt; index 916b472..efb2e53 100644
&gt; &gt; &gt; &gt; --- a/xorg-macros.m4.in
&gt; &gt; &gt; &gt; +++ b/xorg-macros.m4.in
&gt; &gt; &gt; &gt; @@ -1009,3 +1009,21 @@ mv \$(top_srcdir)/.INSTALL.tmp \$(top_srcdir)/INSTALL) \
&gt; &gt; &gt; &gt;  echo 'util-macros \&quot;pkgdatadir\&quot; from xorg-macros.pc not found: installing possibly empty INSTALL.' &gt;&amp;2)&quot;
&gt; &gt; &gt; &gt;  AC_SUBST([INSTALL_CMD])
&gt; &gt; &gt; &gt;  ]) # XORG_INSTALL
&gt; &gt; &gt; &gt; +
&gt; &gt; &gt; &gt; +# XORG_GIT_MODULE_VERSION()
&gt; &gt; &gt; &gt; +# -------------------------
&gt; &gt; &gt; &gt; +# Minimum version: 1.8.0
&gt; &gt; &gt; &gt; +#
&gt; &gt; &gt; &gt; +# Generates the git module version according to the &quot;git describe HEAD&quot;
&gt; &gt; &gt; &gt; +# If the git module has pending changes, it appends &quot;-dirty&quot; to the version tag
&gt; &gt; &gt; &gt; +#
&gt; &gt; &gt; &gt; +AC_DEFUN([XORG_GIT_MODULE_VERSION], [
&gt; &gt; &gt; &gt; +GIT_MODULE_VERSION_CMD=&quot;VER=\`GIT_DIR=\$(top_srcdir)/.git git describe HEAD 2&gt;/dev/null\`; \
&gt; &gt; &gt; &gt; +DVER=\`GIT_DIR=\$(top_srcdir)/.git git diff-index HEAD 2&gt;/dev/null\`; \
&gt; &gt; &gt; &gt; +OUTSTR=\&quot;\#undef XORG_GIT_VERSION\&quot; ; \
&gt; &gt; &gt; &gt; +OUTFILE=\&quot;xorg-git-version.h\&quot;; \
&gt; &gt; &gt; &gt; +test -n \&quot;\$\$VER\&quot; &amp;&amp; OUTSTR=\&quot;\#define XORG_GIT_VERSION \$\$VER\&quot; &amp;&amp; test -n \&quot;\$\$DVER\&quot; &amp;&amp; OUTSTR=\&quot;\#define XORG_GIT_VERSION \$\$VER-dirty\&quot;; \
&gt; &gt; &gt; &gt; +test -e \&quot;\$\$OUTFILE\&quot; || echo \&quot;\$\$OUTSTR\&quot; &gt; \&quot;\$\$OUTFILE\&quot;; \
&gt; &gt; &gt; &gt; +CONTENT=\`cat \$\$OUTFILE\` &amp;&amp; test \&quot;\$\$CONTENT\&quot; = \&quot;\$\$OUTSTR\&quot; || echo \$\$OUTSTR &gt; \$\$OUTFILE;&quot;
&gt; &gt; &gt; &gt; +AC_SUBST([GIT_MODULE_VERSION_CMD])
&gt; &gt; &gt; &gt; +]) # XORG_GIT_MODULE_VERSION
&gt; &gt; 
&gt; &gt; my eyes!
&gt; &gt; 
&gt; &gt; &gt; As I said in reply to the initial patch by Peter I'd like a way to
&gt; &gt; &gt; disable this, because packages might be built from a git tree, which
&gt; &gt; &gt; might be unrelated to the xorg one, or outside of any git tree.  What's
&gt; &gt; &gt; the output like if not building from git?  Does 'make
&gt; &gt; &gt; GIT_MODULE_VERSION_CMD=:' work to disable it (I guess not, because
&gt; &gt; &gt; anything trying to include xorg-git-version.h will be unhappy)?
&gt; &gt; 
&gt; &gt; it simply sets the #undef and nothing will be printed to the log file. Is
&gt; &gt; there any specific argument against _running_ the macro as long if it
&gt; &gt; doesn't add anything to the logfile?
&gt; &gt; 
&gt; &gt; Gaetan:
&gt; &gt; I'm not a big fan of the -dirty either but I guess if others want it we can
&gt; &gt; leave it in.  Two questions though:
&gt; 
&gt; If you remotely help someone debugging a problem, you would like to know
&gt; if tag/commit is really the code he is running or if there are local
&gt; changes. With the commit number you can cross-reference the master repo
&gt; and detect unpsuhed local commits. With the -dirty (now called
&gt; -with-uncommitted-changes) you now the code is tainted with local
&gt; 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.

&gt; &gt; - If modules start using this macro, do they stillhave to add to
&gt; &gt;    DISTCLEANFILES and friends? 
&gt; &gt; - This macro only gets invoked on automake runs, right? So if I pull and
&gt; &gt;   just rebuild, would it update the git version?
&gt; &gt;  
&gt; 
&gt; All options are available in the Makefile.am regarding the invocation of
&gt; the macro (or your original script). I have not paid attention to that,
&gt; it looks you had it covered. The problem domain is similar to ChangeLog.
&gt; You need a trigger when a new commit is available, but the best we could
&gt; do is a dist hook. And you may not be running off git. What use case was
&gt; 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 &quot;do you have commit
1234deadbeef in your local repo&quot; aren't needed, reducing the turnaround
time.

&gt; One suggested a dependency on a git file that changes with the HEAD
&gt; commit, don't recall what the objections were. I'll think about it some
&gt; more.

Acked-by: Peter Hutterer &lt;<A HREF="mailto:peter.hutterer@who-t.net">peter.hutterer@who-t.net</A>&gt; 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.

</PRE>
</BLOCKQUOTE>
Same purpose, more features and bullet proof. Has been in use &gt; 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.<BR>
<A HREF="http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/tree/git_version.sh">http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/tree/git_version.sh</A><BR>
<A HREF="http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/tree/RadeonHD.am">http://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/tree/RadeonHD.am</A><BR>
<BR>
We could use the same mechanism as for the INSTALL_CMD to obtain a copy.<BR>
<BR>
Sample output:
<BLOCKQUOTE>
<PRE>

/*
 * 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 &quot;git version 1.6.0.4&quot;

/* The following helps debug why we sometimes do not find &quot;.git/&quot;:
 * abs_repo_dir=&quot;/home/nadon/xorg/src/driver/xf86-video-radeonhd/.git&quot; (should be &quot;/path/to/.git&quot;)
 * abs_srcdir=&quot;/home/nadon/xorg/src/driver/xf86-video-radeonhd&quot; (absolute top source dir &quot;/path/to&quot;)
 * git_repo_dir=&quot;.git&quot; (usually &quot;.git&quot; or &quot;/path/to/.git&quot;)
 * PWD=&quot;/home/nadon/xorg/src/driver/xf86-video-radeonhd&quot;
 * srcdir=&quot;/home/nadon/xorg/src/driver/xf86-video-radeonhd&quot;
 * working_dir=&quot;/home/nadon/xorg/src/driver/xf86-video-radeonhd&quot;
 */

/* git repo found */
#define GIT_REPO 1

/* Git SHA ID of last commit */
#define GIT_SHAID &quot;f6c99911&quot;

/* Branch this tree is on */
#define GIT_BRANCH &quot;master&quot;

/* Local changes might be breaking things */
#define GIT_DIRTY 1

/* Define GIT_MESSAGE such that
 *&nbsp;&nbsp;&nbsp; printf(&quot;%s: built from %s&quot;, argv[0], GIT_MESSAGE);
 * forms a proper sentence.
 */

#ifdef GIT_DIRTY
# define GIT_DIRTY_MSG &quot; + changes&quot;
#else /* !GIT_DIRTY */
# define GIT_DIRTY_MSG &quot;&quot;
#endif /* GIT_DIRTY */

#ifdef GIT_ERRORS
# define GIT_ERROR_MSG &quot; with error: &quot; GIT_ERRORS
#else /* !GIT_ERRORS */
# define GIT_ERROR_MSG &quot;&quot;
#endif /* GIT_ERRORS */

#ifdef GIT_IS_DIST
# define GIT_DIST_MSG &quot;dist of &quot;
#else /* !GIT_IS_DIST */
# define GIT_DIST_MSG &quot;&quot;
#endif /* GIT_IS_DIST */

#ifdef GIT_REPO
# ifdef GIT_NOT_FOUND
#&nbsp; define GIT_MESSAGE GIT_DIST_MSG &quot;git sources without git: &quot; GIT_NOT_FOUND
# else /* !GIT_NOT_FOUND */
#&nbsp; define GIT_MESSAGE \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GIT_DIST_MSG \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;git branch &quot; GIT_BRANCH &quot;, &quot; \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;commit &quot; GIT_SHAID GIT_DIRTY_MSG \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GIT_ERROR_MSG
# endif /* GIT_NOT_FOUND */
#else /* !GIT_REPO */
# define GIT_MESSAGE GIT_DIST_MSG &quot;non-git sources&quot; GIT_ERROR_MSG
#endif /* GIT_REPO */

#endif /* GIT_VERSION_H */

</PRE>
</BLOCKQUOTE>
This a sample program on how it might be used:<BR>
<BR>
<BLOCKQUOTE>
<PRE>
/* example program demonstrating the use of git_version.sh output */
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;

#ifdef HAVE_CONFIG_H
# include &quot;config.h&quot;
#endif

int main(int argc, char *argv[])
{
&nbsp;&nbsp;&nbsp; const char *const idx = strrchr(argv[0], '/');
&nbsp;&nbsp;&nbsp; const char *const prog = (idx)?(idx+1):(argv[0]);
#ifdef PACKAGE_VERSION
&nbsp;&nbsp;&nbsp; printf(&quot;%s: version %s, built from %s\n&quot;, prog, PACKAGE_VERSION, GIT_MESSAGE);
#elif defined(GIT_MESSAGE)
&nbsp;&nbsp;&nbsp; printf(&quot;%s: built from %s\n&quot;, prog, GIT_MESSAGE);
#endif
&nbsp;&nbsp;&nbsp; return 0;
}
</PRE>
</BLOCKQUOTE>
<BR>
<BR>
<BR>
<BR>
<BR>
<BLOCKQUOTE TYPE=CITE>
<PRE>
Cheers,
  Peter
</PRE>
</BLOCKQUOTE>
</BODY>
</HTML>