Index: trunk/ppStack/src/Makefile.am
===================================================================
--- trunk/ppStack/src/Makefile.am	(revision 22733)
+++ trunk/ppStack/src/Makefile.am	(revision 23143)
@@ -1,5 +1,14 @@
 bin_PROGRAMS = ppStack
 
-ppStack_CFLAGS 	= $(PSLIB_CFLAGS) $(PSMODULE_CFLAGS) $(PSPHOT_CFLAGS) $(PPSTATS_CFLAGS) $(PPSTACK_CFLAGS)
+PPSTACK_VERSION=`if [ -e ../../VERSION ]; then cat ../../VERSION; else svnversion; fi`
+PPSTACK_BRANCH=`if [ -e ../../BRANCH ]; then cat ../../BRANCH; else svn info | sed -n -e '/URL:/ h' -e '/Repository Root:/ { x; H; x; s|Repository Root: \(.*\)\nURL: \1\(.*\)|\2| ; s|^/|| ; s|/[a-zA-Z]*/src.*|| ; p }'; fi`
+PPSTACK_SOURCE=`if [ -e ../../SOURCE ]; then cat ../../SOURCE; else svn info | sed -n -e 's/Repository UUID: // p'; fi`
+
+# Force recompilation of ppStackVersion.c, since it gets the version information
+ppStackVersion.c: FORCE
+	touch ppStackVersion.c
+FORCE: ;
+
+ppStack_CFLAGS 	= $(PSLIB_CFLAGS) $(PSMODULE_CFLAGS) $(PSPHOT_CFLAGS) $(PPSTATS_CFLAGS) $(PPSTACK_CFLAGS) -DPPSTACK_VERSION=\"$(PPSTACK_VERSION)\" -DPPSTACK_BRANCH=\"$(PPSTACK_BRANCH)\" -DPPSTACK_SOURCE=\"$(PPSTACK_SOURCE)\"
 ppStack_LDFLAGS = $(PSLIB_LIBS)   $(PSMODULE_LIBS)   $(PSPHOT_LIBS)   $(PPSTATS_LIBS)   $(PPSTACK_LIBS)
 
Index: trunk/ppStack/src/ppStack.h
===================================================================
--- trunk/ppStack/src/ppStack.h	(revision 22733)
+++ trunk/ppStack/src/ppStack.h	(revision 23143)
@@ -134,4 +134,7 @@
 psString ppStackVersion(void);
 
+/// Return software source
+psString ppStackSource(void);
+
 // Return long description of software version
 psString ppStackVersionLong(void);
Index: trunk/ppStack/src/ppStackVersion.c
===================================================================
--- trunk/ppStack/src/ppStackVersion.c	(revision 22733)
+++ trunk/ppStack/src/ppStackVersion.c	(revision 23143)
@@ -10,21 +10,40 @@
 #include "ppStack.h"
 
-static const char *cvsTag = "$Name: not supported by cvs2svn $";// CVS tag name
-
 psString ppStackVersion(void)
 {
-    psString version = NULL;            // Version, to return
-    psStringAppend(&version, "%s-%s",PACKAGE_NAME,PACKAGE_VERSION);
-    return version;
+#ifndef PPSTACK_VERSION
+#error "PPSTACK_VERSION is not set"
+#endif
+#ifndef PPSTACK_BRANCH
+#error "PPSTACK_BRANCH is not set"
+#endif
+    return psStringCopy(PPSTACK_BRANCH "@" PPSTACK_VERSION);
+}
+
+psString ppStackSource(void)
+{
+#ifndef PPSTACK_SOURCE
+#error "PPSTACK_SOURCE is not set"
+#endif
+    return psStringCopy(PPSTACK_SOURCE);
 }
 
 psString ppStackVersionLong(void)
 {
-    psString version = ppStackVersion(); // Version, to return
-    psString tag = psStringStripCVS(cvsTag, "Name"); // CVS tag
-    psStringAppend(&version, " (cvs tag %s) %s, %s", tag, __DATE__, __TIME__);
-    psFree(tag);
+    psString version = ppStackVersion();  // Version, to return
+    psString source = ppStackSource();    // Source
+
+    psStringPrepend(&version, "ppStack ");
+    psStringAppend(&version, " from %s, built %s, %s", source, __DATE__, __TIME__);
+    psFree(source);
+
+#ifdef __OPTIMIZE__
+    psStringAppend(&version, " optimised");
+#else
+    psStringAppend(&version, " unoptimised");
+#endif
+
     return version;
-}
+};
 
 
