Skip to content
Snippets Groups Projects
SConscript.py 4.18 KiB
Newer Older
  • Learn to ignore specific revisions
  • ###### Hall C Software Main SConscript File #####
    ###### Author:	Edward Brash (brash@jlab.org) June 2013
    
    import os
    import re
    
    import sys
    import subprocess
    import platform
    import time
    
    import SCons.Util
    
    
    ######## ROOT Dictionaries #########
    
    
    roothcdict = pbaseenv.subst('$HC_DIR')+'/HallCDict.C'
    roothcobj = pbaseenv.subst('$HC_SRC')+'/HallCDict.so'
    
     
    hcheadersbase = Glob('src/*.h',exclude=['src/THcGlobals.h','src/HallC_LinkDef.h'])
    
    
    cmd = "cat src/HallC_LinkDef.h_preamble > src/HallC_LinkDef.h"
    
    os.system(cmd)
    
    for hcheaderfile in hcheadersbase:
        filename = '%s' % hcheaderfile
        basefilename = filename.rsplit('.',1)
        newbasefilename = basefilename[0].rsplit('/',1)
    
        # Assume filenames beginning with Scaler are decoder classes
    
        if newbasefilename[1] == 'hc_compiledata':
            continue
    
        if newbasefilename[1][:6] == 'Scaler' or newbasefilename[1] == "TIBlobModule":
    
            cmd1 = "echo '#pragma link C++ class Decoder::%s+;' >> src/HallC_LinkDef.h" % newbasefilename[1]
        else:
            cmd1 = "echo '#pragma link C++ class %s+;' >> src/HallC_LinkDef.h" % newbasefilename[1]
    
    cmd = "cat src/HallC_LinkDef.h_postamble >> src/HallC_LinkDef.h"
    
    hcheaders = Glob('src/*.h',exclude=['src/HallC_LinkDef.h','src/hc_compiledata.h'])+Glob('src/HallC_LinkDef.h')
    
    pbaseenv.RootCint(roothcdict,hcheaders)
    
    pbaseenv.Clean(roothcdict,re.sub(r'\.C\Z','_rdict.pcm',roothcdict))
    
    pbaseenv.SharedObject(target = roothcobj, source = roothcdict)
    
    #######  write src/hc_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'))
    
    
    # SCons seems to ignore $RPATH on macOS... sigh
    if pbaseenv['PLATFORM'] == 'darwin':
        try:
            for rp in pbaseenv['RPATH']:
                pbaseenv.Append(LINKFLAGS = ['-Wl,-rpath,'+rp])
        except KeyError:
            pass
    
    
    analyzer = pbaseenv.Program(target = 'hcana', source = 'src/main.o')
    pbaseenv.Install('./bin',analyzer)
    pbaseenv.Alias('install',['./bin'])
    
    #pbaseenv.Clean(analyzer,)