From dada9972f3b924825a33e0cc547e4fff0b6a26a8 Mon Sep 17 00:00:00 2001
From: "Stephen A. Wood" <saw@jlab.org>
Date: Thu, 15 Mar 2018 17:04:52 -0400
Subject: [PATCH] Implement version numbering for hcana.   We'll start with
 version 0.90.0 and increment the second number up to 99.   Goal is to declare
 a verison 1.0.0 sometime over the summer.

  To change the version, edit both SConscript.py and Makefile.
---
 .gitignore           |  1 +
 Makefile             | 43 +++++++++++++++++++++++++----
 SConscript.py        | 64 ++++++++++++++++++++++++++++++++++++++++++++
 SConstruct           |  6 ++---
 src/THcInterface.cxx | 28 ++++++++++++++++---
 src/THcInterface.h   |  1 +
 src/main.C           |  2 +-
 7 files changed, 132 insertions(+), 13 deletions(-)

diff --git a/.gitignore b/.gitignore
index a961154..978a324 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@ haDict.h
 haDict.C
 hcana
 src/HallC_LinkDef.h
+src/hc_compiledata.h
 
 # scons stuff
 config.log
diff --git a/Makefile b/Makefile
index a14dc6f..56e45df 100644
--- a/Makefile
+++ b/Makefile
@@ -7,9 +7,16 @@
 # List only the implementation files (*.cxx). For every implementation file
 # there must be a corresponding header file (*.h).
 
+SOVERSION := 0.90
+PATCH     := 0
+VERSION   := $(SOVERSION).$(PATCH)
+EXTVERS   :=
+VERCODE := $(shell echo $(subst ., ,$(SOVERSION)) $(PATCH) | \
+   awk '{ print $$1*65536 + $$2*256 + $$3 }')
+
 USEWILDCARD = 1
 ifdef USEWILDCARD
-SRC = $(wildcard src/*.cxx)
+SRC = $(sort $(wildcard src/*.cxx))
 else
 SRC  =  src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \
 	src/THcHallCSpectrometer.cxx \
@@ -183,9 +190,31 @@ HDR           = $(SRC:.cxx=.h)
 DEP           = $(SRC:.cxx=.d) src/main.d
 OBJS          = $(OBJ) $(USERDICT).o
 HDR_COMPILEDATA = $(ANALYZER)/src/ha_compiledata.h
+HCHDR_COMPILEDATA = src/hc_compiledata.h
 
 all:		$(USERLIB) hcana
 
+src/hc_compiledata.h: Makefile
+		@echo "#ifndef HCANA_COMPILEDATA_H" > $@
+		@echo "#define HCANA_COMPILEDATA_H" >> $@
+		@echo "" >> $@
+		@echo "#define HC_INCLUDEPATH \"$(shell pwd)/src\"" >> $@
+		@echo "#define HC_VERSION \"$(VERSION)$(EXTVERS)\"" >> $@
+		@echo "#define HC_DATE \"$(shell date '+%b %d %Y')\"" >> $@
+#		@echo "#define HC_DATETIME \"$(shell date '+%a %b %d %H:%M:%S %Z %Y')\"" >> $@
+		@echo "#define HC_DATETIME \"$(shell date '+%a %b %d %Y')\"" >> $@
+		@echo "#define HC_PLATFORM \"$(shell uname -s)-$(shell uname -r)-$(shell uname -m)\"" >> $@
+		@echo "#define HC_BUILDNODE \"$(shell uname -n)\"" >> $@
+		@echo "#define HC_BUILDDIR \"$(shell pwd)\"" >> $@
+		@echo "#define HC_BUILDUSER \"$(shell whoami)\"" >> $@
+		@echo "#define HC_GITVERS \"$(shell git rev-parse HEAD 2>/dev/null | cut -c1-7)\"" >> $@
+		@echo "#define HC_CXXVERS \"$(shell $(CXX) --version 2>/dev/null | head -1)\"" >> $@
+		@echo "#define HC_ROOTVERS \"$(shell root-config --version)\"" >> $@
+		@echo "#define HCANA_VERSION_CODE $(VERCODE)" >> $@
+		@echo "#define HCANA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))" >> $@
+		@echo "" >> $@
+		@echo "#endif" >> $@
+
 LIBDIR:=$(ANALYZER)
 LIBHALLA     := $(LIBDIR)/libHallA.so
 LIBDC        := $(LIBDIR)/libdc.so
@@ -199,21 +228,25 @@ else
   EVIOLIB    := -levio
 endif
 
-src/THcInterface.d:  $(HDR_COMPILEDATA)
+src/THcInterface.d:  $(HDR_COMPILEDATA) $(HCHDR_COMPILEDATA)
 
 hcana:		src/main.o $(LIBDC) $(LIBHALLA) $(USERLIB)
 		$(LD) $(LDFLAGS) $< -lHallC $(HALLALIBS) $(EVIOLIB) -L. $(CCDBLIBS) \
 		$(GLIBS) -o $@
 
-$(USERLIB):	$(HDR) $(OBJS)
+$(USERLIB).$(VERSION):	$(HDR) $(OBJS)
 		$(LD) $(LDFLAGS) $(SOFLAGS) -o $@ $(OBJS)
 		@echo "$@ done"
 
+$(USERLIB): $(USERLIB).$(VERSION)
+	rm -f $@
+	ln -s $(notdir $<) $@
+
 $(HDR_COMPILEDATA) $(LIBHALLA) $(LIBDC): $(ANALYZER)/Makefile
 		@echo "Building Podd"
 		@cd $(ANALYZER) ; export PODD_EXTRA_DEFINES=-DHALLC_MODS ; make
 
-$(USERDICT).cxx: $(RCHDR) $(HDR) $(LINKDEF)
+$(USERDICT).C: $(RCHDR) $(HDR) $(LINKDEF)
 	@echo "Generating dictionary $(USERDICT)..."
 	$(ROOTBIN)/rootcint -f $@ -c $(INCLUDES) $(CCDBFLAGS) $^
 
@@ -228,7 +261,7 @@ install:	all
 	cp -p $(USERLIB) $(HOME)/cue/SRC/ana
 
 clean:
-		rm -f src/*.o *~ $(USERLIB) $(USERDICT).*
+		rm -f src/*.o *~ $(USERLIB) $(USERLIB).$(VERSION) $(USERDICT).*
 
 realclean:	clean
 		rm -f *.d NormAnaDict.* THaDecDict.* THaScallDict.* bin/hcana
diff --git a/SConscript.py b/SConscript.py
index 4660076..a849b4d 100644
--- a/SConscript.py
+++ b/SConscript.py
@@ -3,6 +3,10 @@
 
 import os
 import re
+import sys
+import subprocess
+import platform
+import time
 import SCons.Util
 Import ('pbaseenv')
 
@@ -36,6 +40,66 @@ pbaseenv.RootCint(roothcdict,hcheaders)
 pbaseenv.Clean(roothcdict,re.sub(r'\.C\Z','_rdict.pcm',roothcdict))
 pbaseenv.SharedObject(target = roothcobj, source = roothcdict)
 
+#######  write src/ha_compiledata.h header file ######
+
+if sys.version_info >= (2, 7):
+    try:
+        cmd = "git rev-parse HEAD 2>/dev/null"
+        gitrev = subprocess.check_output(cmd, shell=True).rstrip()
+    except:
+        gitrev = ''
+    try:
+        cmd = pbaseenv.subst('$CXX') + " --version 2>/dev/null | head -1"
+        cxxver = subprocess.check_output(cmd, shell=True).rstrip()
+    except:
+        cxxver = ''
+    # subprocess gives us byte string literals in Python 3, but we'd like
+    # Unicode strings
+    if sys.version_info >= (3, 0):
+        gitrev = gitrev.decode()
+        cxxver = cxxver.decode()
+else:
+    FNULL = open(os.devnull, 'w')
+    try:
+        gitrev = subprocess.Popen(['git', 'rev-parse', 'HEAD', '2>dev/null'],\
+                    stdout=subprocess.PIPE, stderr=FNULL).communicate()[0].rstrip()
+    except:
+        gitrev =''
+    try:
+        outp = subprocess.Popen([pbaseenv.subst('$CXX'), '--version'],\
+                                stdout=subprocess.PIPE, stderr=FNULL).communicate()[0]
+        lines = outp.splitlines()
+        cxxver = lines[0]
+    except:
+        cxxver = ''
+
+compiledata = 'src/hc_compiledata.h'
+f=open(compiledata,'w')
+f.write('#ifndef HCANA_COMPILEDATA_H\n')
+f.write('#define HCANA_COMPILEDATA_H\n')
+f.write('\n')
+f.write('#define HC_INCLUDEPATH "%s"\n' % (pbaseenv.subst('$HC_SRC')))
+f.write('#define HC_VERSION "%s"\n' % pbaseenv.subst('$HC_VERSION'))
+f.write('#define HC_DATE "%s"\n' % time.strftime("%b %d %Y"))
+f.write('#define HC_DATETIME "%s"\n' % time.strftime("%a %b %d %Y"))
+#f.write('#define HC_DATETIME "%s"\n' % time.strftime("%a %b %d %H:%M:%S %Z %Y"))
+f.write('#define HC_PLATFORM "%s"\n' % platform.platform())
+f.write('#define HC_BUILDNODE "%s"\n' % platform.node())
+f.write('#define HC_BUILDDIR "%s"\n' % os.getcwd())
+try:
+    builduser = pbaseenv['ENV']['LOGNAME']
+except:
+    builduser = ''
+f.write('#define HC_BUILDUSER "%s"\n' % builduser)
+f.write('#define HC_GITVERS "%s"\n' % gitrev[:7])
+f.write('#define HC_CXXVERS "%s"\n' % cxxver)
+f.write('#define HC_ROOTVERS "%s"\n' % pbaseenv.subst('$ROOTVERS'))
+f.write('#define HCANA_VERSION_CODE %s\n' % pbaseenv.subst('$VERCODE'))
+f.write('#define HCANA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))\n')
+f.write('\n')
+f.write('#endif\n')
+f.close()
+
 #######  Start of main SConscript ###########
 
 print ('LIBS = %s\n' % pbaseenv.subst('$LIBS'))
diff --git a/SConstruct b/SConstruct
index 16ca279..9ea5ad9 100644
--- a/SConstruct
+++ b/SConstruct
@@ -25,13 +25,13 @@ baseenv.Append(HA_DIR= baseenv.subst('$HC_DIR')+'/podd')
 baseenv.Append(MAIN_DIR= baseenv.subst('$HEAD_DIR'))
 baseenv.Append(HA_SRC= baseenv.subst('$HA_DIR')+'/src')
 baseenv.Append(HA_DC= baseenv.subst('$HA_DIR')+'/hana_decode')
-baseenv.Append(MAJORVERSION = '1')
-baseenv.Append(MINORVERSION = '6')
+baseenv.Append(MAJORVERSION = '0')
+baseenv.Append(MINORVERSION = '90')
 baseenv.Append(PATCH = '0')
 baseenv.Append(SOVERSION = baseenv.subst('$MAJORVERSION')+'.'+baseenv.subst('$MINORVERSION'))
 baseenv.Append(VERSION = baseenv.subst('$SOVERSION')+'.'+baseenv.subst('$PATCH'))
 baseenv.Append(EXTVERS = '')
-baseenv.Append(HA_VERSION = baseenv.subst('$VERSION')+baseenv.subst('$EXTVERS'))
+baseenv.Append(HC_VERSION = baseenv.subst('$VERSION')+baseenv.subst('$EXTVERS'))
 print ("Hall C Main Directory = %s" % baseenv.subst('$HC_DIR'))
 print ("Hall C Source Directory = %s" % baseenv.subst('$HC_SRC'))
 print ("Hall A Main Directory = %s" % baseenv.subst('$HA_DIR'))
diff --git a/src/THcInterface.cxx b/src/THcInterface.cxx
index a74e5fd..0fe8526 100644
--- a/src/THcInterface.cxx
+++ b/src/THcInterface.cxx
@@ -15,6 +15,8 @@ for the Hall C style parameter database.
 #include "THcDetectorMap.h"
 #include "THcGlobals.h"
 #include "ha_compiledata.h"
+#include "hc_compiledata.h"
+#include <sstream>
 
 #include "TTree.h"
 
@@ -90,7 +92,7 @@ void THcInterface::PrintLogo( Bool_t lite )
      mille = iyear;
    char* root_date = Form("%s %d %4d",months[imonth-1],iday,mille);
 
-   const char* halla_version = HA_VERSION;
+   //   const char* halla_version = HA_VERSION;
    //   const char* halla_date = Form("%d %s %4d",24,months[2-1],2003);
 
 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,18,0)
@@ -101,9 +103,9 @@ void THcInterface::PrintLogo( Bool_t lite )
      Printf("  *            W E L C O M E  to  the            *");
      Printf("  *          H A L L C ++  A N A L Y Z E R       *");
      Printf("  *                                              *");
-     Printf("  *            Based on                          *");
-     Printf("  *  PODD Release  %10s %18s *",halla_version,__DATE__);
-     Printf("  *  Based on ROOT %8s %20s *",root_version,root_date);
+     Printf("  *  hcana release %10s %18s *",HC_VERSION,HC_DATE);
+     Printf("  *  PODD release  %10s %18s *",HA_VERSION,HA_DATE);
+     Printf("  *  ROOT            %8s %18s *",root_version,root_date);
      Printf("  *                                              *");
      Printf("  *            For information visit             *");
      Printf("  *      http://hallcweb.jlab.org/hcana/docs/    *");
@@ -122,6 +124,24 @@ void THcInterface::PrintLogo( Bool_t lite )
 
 }
 
+//_____________________________________________________________________________
+const char* THcInterface::GetVersionString()
+{
+  // Get software version string (printed by analyzer -v)
+
+  static TString version_string;
+
+  if( version_string.IsNull() ) {
+    ostringstream ostr;
+    ostr << "hcana " << HC_VERSION << " ";
+    if( strlen(HC_GITVERS) > 0 )
+      ostr << "git @" << HC_GITVERS << " ";
+    ostr << THaInterface::GetVersionString();
+    version_string = ostr.str().c_str();
+  }
+  return version_string.Data();
+}
+
 //_____________________________________________________________________________
 ClassImp(THcInterface)
 
diff --git a/src/THcInterface.h b/src/THcInterface.h
index 57863e0..39bee34 100644
--- a/src/THcInterface.h
+++ b/src/THcInterface.h
@@ -24,6 +24,7 @@ public:
 #else
   virtual void PrintLogo(Bool_t lite = kFALSE);
 #endif
+  static const char* GetVersionString();
 
 protected:
 
diff --git a/src/main.C b/src/main.C
index 6f57832..2c82d91 100644
--- a/src/main.C
+++ b/src/main.C
@@ -26,7 +26,7 @@ int main(int argc, char **argv)
   }
 
   if( print_version ) {
-    cout << "hcana using " << THcInterface::GetVersionString() << endl;
+    cout << THcInterface::GetVersionString() << endl;
     return 0;
   }
 
-- 
GitLab