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