from SCons.Environment import Environment as Environment
from environment import ProvisionEnvironment as ProvisionEnvironment
from configure import ConfigureHLVM as ConfigureHLVM
from os import path as path
from string import join as sjoin
from string import replace as strrepl
import glob
def GetBuildEnvironment(targets,arguments):
  env = Environment();
  env['HLVM_Copyright'] = 'Copyright (c) 2006 Reid Spencer'
  env['HLVM_Maintainer'] = 'Reid Spencer <rspencer@reidspencer>'
  env['HLVM_Version'] = '0.1svn'
  env['HLVM_SO_CURRENT'] = '0'
  env['HLVM_SO_REVISION'] = '1'
  env['HLVM_SO_AGE'] = '0'
  env['HLVM_SO_VERSION'] = env['HLVM_SO_CURRENT']+':'+env['HLVM_SO_REVISION']
  env['HLVM_SO_VERSION'] += ':' + env['HLVM_SO_AGE']
  ProvisionEnvironment(env,targets,arguments)
  return ConfigureHLVM(env)

def GetAllCXXFiles(env):
  dir = env.Dir('.').abspath
  dir = strrepl(dir,path.join(env['BuildDir'],''),'',1)
  p1 = glob.glob(path.join(dir,'*.cpp'))
  p2 = glob.glob(path.join(dir,'*.cxx'))
  p3 = glob.glob(path.join(dir,'*.C'))
  return env.Flatten([p1,p2,p3])

def GetRNGQuoteSource(env):
  from scons import filterbuilders
  return filterbuilders.RNGQuoteSource(env)

def GetRNGTokenizer(env):
  from scons import filterbuilders
  return filterbuilders.RNGTokenizer(env)

def GetCheck(env):
  from scons import check
  return check.Check(env)

def Dirs(env,dirlist=[]):
  for d in dirlist:
    env.SConscript(path.join(env['BuildDir'],d,'SConscript'))

def join(one,two):
  return path.join([one,two])
