# This is a comment


import os
import subprocess



AddOption('--cxx',
	dest='cxx',
	type='string',
	nargs=1,
	action='store',
	help='cxx compiler')

os.system('perl src/setup.pl')

include = Dir('/opt/local/include/')
lib_path = Dir('/opt/local/lib/');

libs = ['gsl', 'gslcblas', 'boost_system-mt', 'boost_filesystem-mt', 'boost_iostreams-mt' , 'boost_thread-mt', 'pthread', 'z']

#svn_rev = os.popen('svnversion -n .').readline().rstrip()
#svn_rev = '\\"' + svn_rev + '\\"'
#hg_rev = os.popen('hg id').readline().rstrip()
#hg_rev = '\\"' + hg_rev + '\\"'
#pd2_ver = os.popen('cat src/Version.txt').readline().rstrip()
#pd2_ver = '\\"' + pd2_ver + '\\"' 
#comp_date = os.popen('date').readline().rstrip()
#comp_date = '\\"' + comp_date + '\\"'


cppdefines = ['USING_SCONS_BUILDER', ('HAVE_INLINE', 1), ('GSL_RANGE_CHECK', 0), 'NDEBUG', ('BOOST_FILESYSTEM_VERSION', 3) ] #[('SVN_REV',svn_rev), ('HG_REV',hg_rev), ('_PRODART_VERSION_', pd2_ver), ('_COMPILE_DATE_', comp_date)]
gcc_cppflags = ['-ffast-math', '-msse3', '-funroll-loops', '-pipe','-g3', '-Wall', '-fmessage-length=0' ]

# optimisation level normally -O2
gcc_cppflags = gcc_cppflags + ['-O2']

gcc_cppflags = gcc_cppflags + ['-rdynamic']

# FOR profiling
#gcc_cppflags = gcc_cppflags + ['-pg']

#pose_src = Glob('src/pose//*.cpp')

bbb_src = Glob('src/backbonebuilder/*.cpp')
movers_src = Glob('src/movers/*.cpp') +  Glob('src/movers/bb_movers/*.cpp') + Glob('src/movers/ca_movers/*.cpp') +  Glob('src/movers/fa_movers/*.cpp')
pose_src = Glob('src/pose/*.cpp')
pose_meta_src = Glob('src/pose_meta/*.cpp') +  Glob('src/pose_meta/frag_classify/*.cpp')
pose_utils_src = Glob('src/pose_utils/*.cpp')
potentials_src = Glob('src/potentials/*.cpp') +  Glob('src/potentials/bb_potentials/*.cpp') +  Glob('src/potentials/ca_potentials/*.cpp')
pd_env_src = Glob('src/prodart_env/*.cpp')
protocols_src = Glob('src/protocols/*.cpp')
rotamers_src = Glob('src/rotamers/*.cpp') + Glob('src/rotamers/sidechain_builders/*.cpp')
sim_src = Glob('src/simulation/*.cpp') +  Glob('src/simulation/bb_mc_protocols/*.cpp') + Glob('src/simulation/ca_mc_protocols/*.cpp')
sticks_src = Glob('src/sticks/*.cpp')
tclap_src = Glob('src/tclap/*.cpp')
#_src = Glob('src/tests/*.cpp')
utils_src = Glob('src/utils/*.cpp')


common_sources = bbb_src + movers_src + pose_src + pose_meta_src + pose_utils_src + potentials_src + pd_env_src + protocols_src + rotamers_src + sim_src + sticks_src + tclap_src + utils_src

#print common_sources

gcc_link_flags = []
gcc_link_flags = gcc_link_flags + ['-static']
gcc_link_flags = gcc_link_flags + ['-g3']
gcc_link_flags = gcc_link_flags + ['-rdynamic']

# for profiling:
#gcc_link_flags = gcc_link_flags + ['-pg']

gcc_env = Environment(ENV = os.environ, CC = 'gcc', CXX = 'g++', LIBPATH = lib_path, LIBS = libs, CPPDEFINES = cppdefines, CPPFLAGS = gcc_cppflags, LINKFLAGS=gcc_link_flags )   # Create an environmnet
gcc_env.Append(CPPPATH=["#/src"] + [include])

icc_env = Environment(ENV = os.environ, CC = 'icc', CXX = 'icpc', LIBPATH = lib_path, LIBS = libs, CPPDEFINES = cppdefines, CPPFLAGS = gcc_cppflags, LINKFLAGS=gcc_link_flags )
icc_env.Append(CPPPATH=["#/src"] + [include])

llvm_gcc_env = Environment(ENV = os.environ, CC = 'llvm-gcc', CXX = 'llvm-g++', LIBPATH = lib_path, LIBS = libs, CPPDEFINES = cppdefines, CPPFLAGS = gcc_cppflags, LINKFLAGS=gcc_link_flags )   # Create an environmnet
llvm_gcc_env.Append(CPPPATH=["#/src"] + [include])

clang_env = Environment(ENV = os.environ, CC = 'clang', CXX = 'clang++', LIBPATH = lib_path, LIBS = libs, CPPDEFINES = cppdefines, CPPFLAGS = gcc_cppflags, LINKFLAGS=gcc_link_flags )   # Create an environmnet
clang_env.Append(CPPPATH=["#/src"] + [include])


if GetOption('cxx') == None:
	print "--cxx option not set: ", GetOption('cxx')
	env = gcc_env
	print "setting env to gcc_env"
elif GetOption('cxx') == "g++" or GetOption('cxx') == "gcc":
        print "--cxx option set: ", GetOption('cxx')
        env = gcc_env
        print "setting env to gcc_env"
elif GetOption('cxx') == "llvm-g++" or GetOption('cxx') == "llvm-gcc":
        print "--cxx option set: ", GetOption('cxx')
	env = llvm_gcc_env
	print "setting env to llvm_gcc_env"
elif GetOption('cxx') == "clang++" or GetOption('cxx') == "clang":
	print "--cxx option set: ", GetOption('cxx')
	env = clang_env
	print "setting env to clang_env"
elif GetOption('cxx') == "icc" or GetOption('cxx') == "icpc":
        print "--cxx option set: ", GetOption('cxx')
        env = icc_env
        print "setting env to icc_env"
else:
        print "--cxx option set: ", GetOption('cxx')
	print "ERROR: C++ compiler option not recognised"



print "CC is:", env['CC']
print "CXX is:", env['CXX']
print "LINK is:", env['LINK']
print "TOOLS is:", env['TOOLS']


#print env.Dump()

try:
	os_cppath = os.environ['INCLUDE'].split(':')
	env.Append(CPPPATH=os_cppath)
except KeyError:
	print "INFO: no OS INCLUDE path found"	

print "CPPPATH =", env['CPPPATH']

try:
	os_libpath = os.environ['LD_LIBRARY_PATH'].split(':')
	env.Append(LIBPATH=os_libpath)
except KeyError:
	print "INFO: no OS LIBPATH path found"

print "LIBPATH =", env['LIBPATH']


env.Program(target = "bin/pd2_loop_model", source = ["src/pd2_loop_model.cpp"] + common_sources )
env.Program(target = "bin/pd2_ca2main", source = ["src/pd2_ca2main.cpp"] + common_sources )
env.Program(target = "bin/pd2_minimise", source = ["src/pd2_minimise.cpp"] + common_sources )
env.Program(target = "bin/pdb_utils", source = ["src/pdb_utils.cpp"] + common_sources )
#env.Program(target = "bin/", source = ["src/"] + common_sources )









