#!/usr/bin/env python
###### Hall C Software Main SConstruct Build File #####
###### Author:	Edward Brash (brash@jlab.org) June 2013

import os
import sys
#import platform
#import commands
import SCons
import subprocess

####### Check SCons version ##################
print('!!! Building the Hall C analyzer and libraries with SCons requires')
print('!!! SCons version 2.5.0 or newer.')
EnsureSConsVersion(2,5,0)

baseenv = Environment(ENV = os.environ,tools=["default"],toolpath=['podd/site_scons'])

####### Hall A Build Environment #############
#
baseenv.Append(HEAD_DIR= Dir('.').abspath)
baseenv.Append(HC_DIR= baseenv.subst('$HEAD_DIR'))
baseenv.Append(HC_SRC= baseenv.subst('$HC_DIR')+'/src')
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 = '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(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'))
print ("Software Version = %s" % baseenv.subst('$VERSION'))
ivercode = 65536*int(float(baseenv.subst('$SOVERSION')))+ 256*int(10*(float(baseenv.subst('$SOVERSION'))-int(float(baseenv.subst('$SOVERSION')))))+ int(float(baseenv.subst('$PATCH')))
baseenv.Append(VERCODE = ivercode)
baseenv.Append(CPPPATH = ['$HC_SRC','$HA_SRC','$HA_DC'])

sys.path.insert(1,baseenv.subst('$HA_DIR'+'/site_scons'))
import configure
from rootcint import rootcint

configure.FindROOT(baseenv)
# If EVIO is set up, use it. Otherwise the Podd submodule will build it
# and we will pick it up from there
configure.FindEVIO(baseenv, build_it = False, fail_if_missing = False)

bld = Builder(action=rootcint)
baseenv.Append(BUILDERS = {'RootCint': bld})

######## cppcheck ###########################

proceed = "1" or "y" or "yes" or "Yes" or "Y"
if baseenv.subst('$CPPCHECK')==proceed:
    is_cppcheck = which('cppcheck')
    print ("Path to cppcheck is %s\n" % is_cppcheck)

    if(is_cppcheck == None):
        print('!!! cppcheck not found on this system.  Check if cppcheck is installed and in your PATH.')
        Exit(1)
    else:
        cppcheck_command = baseenv.Command('cppcheck_report.txt',[],"cppcheck --quiet --enable=all src/ 2> $TARGET")
        baseenv.AlwaysBuild(cppcheck_command)

######## Configure Section #######

if not (baseenv.GetOption('clean') or baseenv.GetOption('help')):

    configure.config(baseenv,ARGUMENTS)

    conf = Configure(baseenv)
    if not conf.CheckCXX():
        print('!!! Your compiler and/or environment is not correctly configured.')
        Exit(1)
    # if not conf.CheckFunc('printf'):
    #         print('!!! Your compiler and/or environment is not correctly configured.')
    #         Exit(1)
    if conf.CheckCXXHeader('sstream'):
        conf.env.Append(CPPDEFINES = 'HAS_SSTREAM')
    baseenv = conf.Finish()

Export('baseenv')

#print (baseenv.Dump())
#print ('CXXFLAGS = ', baseenv['CXXFLAGS'])
#print ('LINKFLAGS = ', baseenv['LINKFLAGS'])
#print ('SHLINKFLAGS = ', baseenv['SHLINKFLAGS'])

####### Start of main SConstruct ############

hallclib = 'HallC'
hallalib = 'HallA'
dclib = 'dc'
eviolib = 'evio'

baseenv.Append(LIBPATH=['$HC_DIR','$EVIO_LIB','$HA_DIR','$HC_SRC','$HA_SRC','$HA_DC'])
baseenv.Replace(SHLIBSUFFIX = '.so')
baseenv.Replace(SOSUFFIX = baseenv.subst('$SHLIBSUFFIX'))
#baseenv.Replace(SHLIBSUFFIX = '.so')
baseenv.Append(SHLIBSUFFIX = '.'+baseenv.subst('$VERSION'))

pbaseenv=baseenv.Clone()
pbaseenv.Prepend(LIBS=[hallclib,hallalib,dclib,eviolib])
baseenv.Prepend(LIBS=[hallalib,dclib,eviolib])
Export('pbaseenv')

if pbaseenv['CXX'] == 'g++':
    gxxVersion = [int(i) for i in pbaseenv['CXXVERSION'].split('.')]
    if (gxxVersion[0] < 4) or (gxxVersion[0] == 4 and gxxVersion[1] < 4):
        print('Error: g++ version too old! Need at least g++ 4.4!')
        Exit(1)

##directorylist = ['./','src','podd','podd/src','podd/hana_decode']
##SConscript('podd/SConstruct')

if baseenv.GetOption('clean'):
    subprocess.call(['echo', '!!!!!! Cleaning Podd Directory !!!!!! '])
    podd_command_scons = "cd %s; scons -c" % baseenv.subst('$HA_DIR')
else:
    subprocess.call(['echo', '!!!!!! Building Podd !!!!!! '])
    podd_command_scons = "cd %s; scons" % baseenv.subst('$HA_DIR')
    if baseenv.GetOption('num_jobs'):
        podd_command_scons += " -j%s" % (GetOption('num_jobs')) 
    if baseenv.GetOption('silent'):
        podd_command_scons += " -s"
    for key,value in ARGLIST:
        podd_command_scons += " %s=%s" % (key,value)

print ("podd_command_scons = %s" % podd_command_scons)

os.system(podd_command_scons)

directorylist = ['./','src']
SConscript(dirs = directorylist,name='SConscript.py',exports='baseenv')

#######  End of SConstruct #########

# Local Variables:
# mode: python
# End: