[llvm-commits] [hlvm] r38076 - in /hlvm/trunk: SConstruct hlvm/AST/SConscript hlvm/Base/SConscript hlvm/Reader/SConscript hlvm/Reader/XML/SConscript hlvm/Reader/XML/XMLReader.cpp hlvm/SConscript hlvm/Writer/SConscript hlvm/Writer/XML/SConscript scons/configure.py scons/environment.py scons/filterbuilders.py scons/main.py tools/SConscript tools/hlvm-xml2xml/SConscript

Reid Spencer reid at x10sys.com
Sat Jul 7 16:59:36 PDT 2007


Author: reid
Date: Sat Jul  7 18:59:36 2007
New Revision: 38076

URL: http://llvm.org/viewvc/llvm-project?rev=38076&view=rev
Log:
Get much of scons support working. The major change was getting the
configuration stuff integrated and converting the mkTokenizer utility to
Python.

Added:
    hlvm/trunk/scons/filterbuilders.py
    hlvm/trunk/tools/hlvm-xml2xml/SConscript
Modified:
    hlvm/trunk/SConstruct
    hlvm/trunk/hlvm/AST/SConscript
    hlvm/trunk/hlvm/Base/SConscript
    hlvm/trunk/hlvm/Reader/SConscript
    hlvm/trunk/hlvm/Reader/XML/SConscript
    hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp
    hlvm/trunk/hlvm/SConscript
    hlvm/trunk/hlvm/Writer/SConscript
    hlvm/trunk/hlvm/Writer/XML/SConscript
    hlvm/trunk/scons/configure.py
    hlvm/trunk/scons/environment.py
    hlvm/trunk/scons/main.py
    hlvm/trunk/tools/SConscript

Modified: hlvm/trunk/SConstruct
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/SConstruct?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/SConstruct (original)
+++ hlvm/trunk/SConstruct Sat Jul  7 18:59:36 2007
@@ -2,10 +2,10 @@
 # 
 
 # Set up scons
-import os
-from scons.main import GetBuildEnvironment
-env = GetBuildEnvironment(COMMAND_LINE_TARGETS)
+from os import path
+from scons import main
+env = main.GetBuildEnvironment(COMMAND_LINE_TARGETS,ARGUMENTS)
 Export('env')
 
-SConscript('hlvm/SConscript',build_dir=os.path.join(env['BuildDir'],"hlvm"))
-SConscript('tools/SConscript',build_dir=os.path.join(env['BuildDir'],"tools"))
+SConscript(path.join(env['BuildDir'],'hlvm','SConscript'))
+SConscript(path.join(env['BuildDir'],'tools','SConscript'))

Modified: hlvm/trunk/hlvm/AST/SConscript
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/AST/SConscript?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/hlvm/AST/SConscript (original)
+++ hlvm/trunk/hlvm/AST/SConscript Sat Jul  7 18:59:36 2007
@@ -1,5 +1,3 @@
-#
-import glob
-files = glob.glob('*.cpp')
+from scons import main
 Import('env')
-env.Library('HLVMast',files)
+env.Library('HLVMast',main.GetAllCXXFiles(env))

Modified: hlvm/trunk/hlvm/Base/SConscript
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Base/SConscript?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Base/SConscript (original)
+++ hlvm/trunk/hlvm/Base/SConscript Sat Jul  7 18:59:36 2007
@@ -1,3 +1,3 @@
-import glob
-files = glob.glob('*.cpp')
-Library('HLVMbase',files)
+Import('env')
+from scons import main
+env.Library('HLVMbase',main.GetAllCXXFiles(env))

Modified: hlvm/trunk/hlvm/Reader/SConscript
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Reader/SConscript?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Reader/SConscript (original)
+++ hlvm/trunk/hlvm/Reader/SConscript Sat Jul  7 18:59:36 2007
@@ -1,4 +1,2 @@
-#
-SConscript([
-  'XML/SConscript',
-])
+Import('env')
+SConscript('XML/SConscript')

Modified: hlvm/trunk/hlvm/Reader/XML/SConscript
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Reader/XML/SConscript?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Reader/XML/SConscript (original)
+++ hlvm/trunk/hlvm/Reader/XML/SConscript Sat Jul  7 18:59:36 2007
@@ -1,3 +1,7 @@
-import glob
-files = glob.glob('*.cpp')
-Library('HLVMXMLReader',files)
+Import('env')
+from scons import main
+main.GetRNGQuoteSource(env)
+main.GetRNGTokenizer(env)
+env.RNGQuoteSource('HLVM.rng.inc','HLVM.rng')
+env.RNGTokenizer('HLVMTokenizer.cpp','HLVM.rng')
+env.Library('HLVMXMLReader',main.GetAllCXXFiles(env))

Modified: hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp (original)
+++ hlvm/trunk/hlvm/Reader/XML/XMLReader.cpp Sat Jul  7 18:59:36 2007
@@ -51,7 +51,7 @@
 namespace {
 
 const char HLVMGrammar[] = 
-#include "HLVM.rng.inc"
+#include <hlvm/Reader/XML/HLVM.rng.inc>
 ;
 
 class XMLReaderImpl : public XMLReader {
@@ -219,7 +219,8 @@
     xmlBufferPtr buffer = xmlBufferCreate();
     xmlNodeDump(buffer,doc,cur,0,0);
     int length = xmlBufferLength(buffer);
-    std::string str(reinterpret_cast<const char*>(xmlBufferContent(buffer)));
+    std::string 
+      str(reinterpret_cast<const char*>(xmlBufferContent(buffer)),length);
     str.erase(0,5); // Zap the <doc> at the start
     str.erase(str.length()-6); // Zap the </doc> at the end
     Documentation* progDoc = ast->new_Documentation(loc);

Modified: hlvm/trunk/hlvm/SConscript
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/SConscript?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/hlvm/SConscript (original)
+++ hlvm/trunk/hlvm/SConscript Sat Jul  7 18:59:36 2007
@@ -1,7 +1,6 @@
 #
-SConscript([
-  'Base/SConscript',
-  'AST/SConscript',
-  'Reader/SConscript',
-  'Writer/SConscript'
-])
+Import('env')
+env.SConscript('Base/SConscript')
+env.SConscript('AST/SConscript')
+env.SConscript('Reader/SConscript')
+env.SConscript('Writer/SConscript')

Modified: hlvm/trunk/hlvm/Writer/SConscript
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Writer/SConscript?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Writer/SConscript (original)
+++ hlvm/trunk/hlvm/Writer/SConscript Sat Jul  7 18:59:36 2007
@@ -1,4 +1,2 @@
-#
-SConscript([
-  'XML/SConscript',
-])
+Import('env')
+SConscript('XML/SConscript')

Modified: hlvm/trunk/hlvm/Writer/XML/SConscript
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/hlvm/Writer/XML/SConscript?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/hlvm/Writer/XML/SConscript (original)
+++ hlvm/trunk/hlvm/Writer/XML/SConscript Sat Jul  7 18:59:36 2007
@@ -1,3 +1,3 @@
-import glob
-files = glob.glob('*.cpp')
-Library('HLVMXMLWriter',files)
+Import('env')
+from scons import main
+env.Library('HLVMXMLWriter',main.GetAllCXXFiles(env))

Modified: hlvm/trunk/scons/configure.py
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/scons/configure.py?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/scons/configure.py (original)
+++ hlvm/trunk/scons/configure.py Sat Jul  7 18:59:36 2007
@@ -1,16 +1,144 @@
 from SCons.Environment import Environment as Environment
 from SCons.Script.SConscript import SConsEnvironment as SConsEnvironment
+from os.path import join as pjoin
+from os.path import isdir as isdir
+from os.path import isfile as isfile
+from os.path import exists as exists
+from os import environ as environ
+
+def CheckProgram(context,progname,varname,moredirs=[]):
+  ret = 0
+  context.Message("Checking for " + progname + "...")
+  PATH = environ['PATH']
+  dirs = PATH.split(':') + moredirs
+  for dir in dirs:
+    fname = pjoin(dir,progname)
+    if exists(fname) and isfile(fname):
+      context.env[varname] = fname
+      ret = 1
+      break;
+  context.Result(ret)
+  return ret
+
+  
+def AskForDirs(context,pkgname,hdr,lib):
+  hdrdir = _getline(context.env,
+    'Enter directory containing %(name)s headers: ' % {'name':pkgname }
+  )
+  hdrpath = pjoin(hdrdir,hdr)
+  if isfile(hdrpath):
+    libdir = _getline(context.env,
+      'Enter directory containing %(name)s libraries: ' % { 'name':pkgname }
+    )
+    libpath = pjoin(libdir,context.env['LIBPREFIX'])
+    libpath += lib
+    libpath += context.env['LIBSUFFIX']
+    if isfile(libpath):
+      context.env[pkgname + '_lib'] = libdir
+      context.env[pkgname + '_inc'] = hdrdir
+      context.env.AppendUnique(LIBPATH=[libdir],CPPPATH=[hdrdir])
+      return 1
+    else:
+      print "Didn't find ",pkgname," libraries in ",libpath,". Try again."
+      return AskForDirs(context,pkgname,hdr,lib)
+  else:
+    print "Didn't find ",pkgname," headers in ",hdrpath,". Try again."
+    return AskForDirs(context,pkgname,hdr,lib)
+
+def FindPackage(context,pkgname,hdr,libs,code='main(argc,argv);',paths=[],
+                objs=[], hdrpfx=''):
+  msg = 'Checking for ' + pkgname + '...'
+  context.Message(msg)
+  lastLIBS = context.env['LIBS']
+  lastLIBPATH = context.env['LIBPATH']
+  lastCPPPATH= context.env['CPPPATH']
+  lastLINKFLAGS = context.env['LINKFLAGS']
+  prog_template = """
+#include <%(include)s>
+int main(int argc, char **argv) { 
+  %(code)s
+  return 0;
+}
+"""
+  context.env.AppendUnique(LIBS = libs)
+  paths += ['/proj','/proj/install','/opt/','/sw','/usr/local','/usr','/']
+  for p in paths:
+    for ldir in ['lib','bin','libexec','libs','LIBS']:
+      libdir = pjoin(p,ldir)
+      if not isdir(libdir):
+        continue
+      for alib in libs:
+        library = pjoin(libdir,context.env['LIBPREFIX'])
+        library += alib + context.env['LIBSUFFIX']
+        if not exists(library):
+          continue
+        objects = " "
+        count = 0
+        for o in objs:
+          obj =  pjoin(libdir,context.env['OBJPREFIX'])
+          obj += o + context.env['OBJSUFFIX']
+          if not exists(obj):
+            continue;
+          else:
+            count += 1
+            objects += obj + " "
+        if count != len(objs):
+          continue
+        for incdir in ['include', 'inc', 'incl']:
+          hdrdir = pjoin(p,incdir)
+          if not isdir(hdrdir):
+            continue
+          if hdrpfx != '':
+            hdrdir = pjoin(hdrdir,hdrpfx)
+            if not exists(hdrdir):
+              continue
+          header = pjoin(hdrdir,hdr)
+          if not exists(hdrdir):
+            continue
+          context.env.AppendUnique(LIBPATH = [libdir])
+          context.env.AppendUnique(CPPPATH = [hdrdir])
+          context.env.AppendUnique(LINKFLAGS = objects)
+          ret = context.TryRun(
+            prog_template % {'include':hdr,'code':code},'.cpp'
+          )
+          if not ret:
+            context.env.Replace(LIBS=lastLIBS, LIBPATH=lastLIBPATH, 
+              CPPPATH=lastCPPPATH, LINKFLAGS=lastLINKFLAGS)
+            continue
+          context.env[pkgname + '_lib'] = libdir
+          context.env[pkgname + '_inc'] = hdrdir
+          context.Result('Found: (' + hdrdir + ',' + libdir + ')')
+          return [libdir,hdrdir]
+  context.Result( 'Not Found' )
+  return AskForDirs(context,pkgname,hdr,libs)
+
+def _getline(env,msg):
+  response = raw_input(msg)
+  if response == 'quit' or response == "exit":
+    print "Configuration terminated by user"
+    env.Exit(1)
+  return response
 
-def ConfigureHLVM(env):
-  conf = env.Configure()
-  CheckStdCXXHeaders(conf,env)
-  CheckForLibXML2(conf,env)
-  CheckForAPR(conf,env)
-  CheckForAPRU(conf,env)
-  CheckForLLVM(conf,env)
-  env = conf.Finish()
+def FindLLVM(conf,env):
+  code = 'llvm::Module* M = new llvm::Module("Name");'
+  return conf.FindPackage('LLVM','llvm/Module.h',['LLVMSupport','LLVMSystem'],
+      code,['/proj/install/llvm'],['LLVMCore','LLVMbzip2'])
+
+def FindAPR(conf,env):
+  code = 'apr_initialize();'
+  return conf.FindPackage('APR',pjoin('apr-1','apr_general.h'),['apr-1'],code)
+
+def FindAPRU(conf,env):
+  code = 'apu_version_string();'
+  return conf.FindPackage('APRU',pjoin('apr-1','apu_version.h'),['aprutil-1'],
+      code)
+
+def FindLibXML2(conf,env):
+  code = 'xmlNewParserCtxt();'
+  return conf.FindPackage('LIBXML2',pjoin('libxml','parser.h'),['xml2'],code,
+    [],[],'libxml2')
 
-def CheckStdCXXHeaders(env):
+def CheckStdCXXHeaders(conf,env):
   if not conf.CheckCXXHeader('vector'):
     env.Exit(1)
   if not conf.CheckCXXHeader('map'):
@@ -19,19 +147,33 @@
     env.Exit(1)
   if not conf.CheckCXXHeader('iostream'):
     env.Exit(1)
+  return 1
 
-def CheckForLibXML2(conf,env):
-
-def CheckForAPR(conf,env):
+def CheckForPrograms(conf,env):
+  if not conf.CheckProgram('gperf','GPERF'):
+    env.Exit(1)
+  return 1
 
-def CheckForAPRU(conf,env):
+#dnl AC_PATH_PROG(path_EGREP, egrep, egrep)
+#dnl AC_PATH_PROG(path_GPP, g++, g++)
+#dnl AC_PATH_PROG(path_GPROF, gprof, gprof)
+#dnl AC_PATH_PROG(path_PERL, perl, perl)
+#dnl AC_PATH_PROG(path_PKGDATA, pkgdata, pkgdata)
+#dnl AC_PATH_PROG(path_SORT, sort, sort)
+#dnl AC_PATH_PROG(path_UNIQ, uniq, uniq)
 
-def CheckForLLVM(conf,env):
-  if not conf.CheckLibWithHeader(
-      libs='LLVMCore',
-      header='llvm/Module.h',
-      language='c++',
-      call='llvm::Module* m = new llvm::Module("name")',
-      autoadd=1):
-    env.Exit(1)
-  return env
+def ConfigureHLVM(env):
+  conf = env.Configure(custom_tests = { 
+    'FindPackage':FindPackage, 'AskForDirs':AskForDirs,
+    'CheckProgram':CheckProgram },
+    conf_dir=pjoin(env['BuildDir'],'conftest'),
+    log_file=pjoin(env['BuildDir'],'config.log')
+  )
+  env['LIBS'] = ""
+  CheckForPrograms(conf,env)
+  CheckStdCXXHeaders(conf,env)
+  FindLibXML2(conf,env)
+  FindAPR(conf,env)
+  FindAPRU(conf,env)
+  FindLLVM(conf,env)
+  return conf.Finish()

Modified: hlvm/trunk/scons/environment.py
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/scons/environment.py?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/scons/environment.py (original)
+++ hlvm/trunk/scons/environment.py Sat Jul  7 18:59:36 2007
@@ -2,18 +2,20 @@
 # 
 
 # Import stuff we need from SCons package
-from string import join
+from os.path import join as pjoin
 from SCons.Options import Options as Options
 from SCons.Options import BoolOption as BoolOption
+from SCons.Options import PathOption as PathOption
 from SCons.Environment import Environment as Environment
 from SCons.Script.SConscript import SConsEnvironment as SConsEnvironment
 
-def ProvisionEnvironment(env):
+def ProvisionEnvironment(env,targets,arguments):
   env.EnsurePythonVersion(2,3)
   env.EnsureSConsVersion(0,96)
   env.SetOption('implicit_cache',1)
   env.TargetSignatures('build')
-  opts = Options('custom.py')
+  VariantName=''
+  opts = Options('custom.py',arguments)
   opts.AddOptions(
     BoolOption('assrt','Include assertions in the code',1),
     BoolOption('debug','Build with debug options turned on',1),
@@ -21,28 +23,27 @@
     BoolOption('optimize','Build object files with optimization',0),
     BoolOption('profile','Generate profiling aware code',0),
     BoolOption('small','Generate smaller code rather than faster',0),
-    BoolOption('config','Generation the configuration data',0)
+    BoolOption('config','Generation the configuration data',0),
+    PathOption('prefix','Specify where to install HLVM','/usr/local')
   )
   opts.Update(env)
-  env['CC']       = 'gcc'
-  env['CCFLAGS']  = '-pipe -Wall -Wcast-align -Wpointer-arith'
-  env['CXXFLAGS'] = join([
-    "-pipe -Wall -Wcast-align -Wpointer-arith -Wno-deprecated -Wold-style-cast",
-    "-Woverloaded-virtual -ffor-scope -fno-operator-names"])
+  env['CC']       = 'g++'
+  env['CCFLAGS']  = ' -pipe -Wall -Wcast-align -Wpointer-arith'
+  env['CXXFLAGS'] = ' -pipe -Wall -Wcast-align -Wpointer-arith -Wno-deprecated'
+  env['CXXFLAGS']+= ' -Wold-style-cast -Woverloaded-virtual -ffor-scope'
+  env['CXXFLAGS']+= ' -fno-operator-names'
   env['CPPDEFINES'] = { '__STDC_LIMIT_MACROS':None }
-  env.Prepend(CPPPATH='#')
-  VariantName=''
   if env['small'] == 1:
     VariantName='S'
-    env.Append(CCFLAGS='-Os')
-    env.Append(CXXFLAGS='-Os')
+    env.Append(CCFLAGS=' -Os')
+    env.Append(CXXFLAGS=' -Os')
   else :
     VariantName='s'
 
   if env['profile'] == 1:
     VariantName+='P'
-    env.Append(CCFLAGS='-pg')
-    env.Append(CXXFLAGS='-pg')
+    env.Append(CCFLAGS=' -pg')
+    env.Append(CXXFLAGS=' -pg')
   else :
     VariantName+='p'
 
@@ -54,8 +55,8 @@
 
   if env['debug'] == 1 :
     VariantName += 'D'
-    env.Append(CCFLAGS='-g')
-    env.Append(CXXFLAGS='-g')
+    env.Append(CCFLAGS=' -g')
+    env.Append(CXXFLAGS=' -g')
     env.Append(CPPDEFINES={'HLVM_DEBUG':None})
   else :
     VariantName+='d'
@@ -64,20 +65,30 @@
     VariantName+='I'
   else :
     VariantName+='i'
-    env.Append(CXXFLAGS='-fno-inline')
+    env.Append(CXXFLAGS=' -fno-inline')
 
   if env['optimize'] == 1 :
     VariantName+='O'
-    env.APpend(CCFLAGS='-O3')
-    env.Append(CXXFLAGS='-O3')
+    env.Append(CCFLAGS=' -O3')
+    env.Append(CXXFLAGS=' -O3')
   else :
     VariantName+='o'
-    env.Append(CCFLAGS='-O1')
-    env.Append(CXXFLAGS='-O1')
+    env.Append(CCFLAGS=' -O1')
+    env.Append(CXXFLAGS=' -O1')
 
+  BuildDir = 'build.' + VariantName
   env['Variant'] = VariantName
-  env['BuildDir'] = 'build.'
-  env['BuildDir'] += VariantName
+  env['BuildDir'] = BuildDir
+  env['LIBPATH'] = [
+    pjoin(BuildDir,'hlvm/Base'),
+    pjoin(BuildDir,'hlvm/AST'),
+    pjoin(BuildDir,'hlvm/Reader/XML'),
+    pjoin(BuildDir,'hlvm/Writer/XML')
+  ];
+  env.BuildDir(pjoin(BuildDir,'hlvm'),'hlvm',duplicate=0)
+  env.BuildDir(pjoin(BuildDir,'tools'),'tools',duplicate=0)
+  env.Prepend(CPPPATH=[pjoin('#',BuildDir)])
+  env.Prepend(CPPPATH=['#'])
 
   opts.Save('options.cache', env)
   env.Help(opts.GenerateHelpText(env,sort=cmp))

Added: hlvm/trunk/scons/filterbuilders.py
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/scons/filterbuilders.py?rev=38076&view=auto

==============================================================================
--- hlvm/trunk/scons/filterbuilders.py (added)
+++ hlvm/trunk/scons/filterbuilders.py Sat Jul  7 18:59:36 2007
@@ -0,0 +1,113 @@
+from SCons.Environment import Environment as Environment
+from environment import ProvisionEnvironment as ProvisionEnvironment
+import re,fileinput,os
+from string import join as sjoin
+from os.path import join as pjoin
+
+def _sedit(input,output,substs):
+  res = []
+  f=open(output[0].path,'w')
+  for subst in substs:
+    res.append(re.compile(subst[0]))
+  for line in fileinput.input(input[0].path):
+    count = 0
+    for r in res:
+      line = res[count].sub(substs[count][1],line,0)
+      count += 1
+    f.write(line)
+  f.close()
+
+def QuoteSourceAction(target,source,env):
+  substs = [['[\\\\]','\\\\\\\\'],['"','\\"'],['^(.*)$','"\\1"']]
+  _sedit(source,target,substs)
+
+def QuoteSourceMessage(target,source,env):
+  return "Converting %s to %s as quoted source" % (source[0],target[0])
+
+def RNGQuoteSource(env):
+  a = env.Action(QuoteSourceAction,QuoteSourceMessage)
+  b = env.Builder(action=a,suffix='inc',src_suffix='rng',single_source=1)
+  env.Append(BUILDERS = {'RNGQuoteSource':b})
+  return b
+
+def getSchemaTokens(fname):
+  elemPat = re.compile('<element[^>]*name="([^"]*)"')
+  attrPat = re.compile('<attribute[^>]*name="([^"]*)"')
+  valuPat = re.compile('<value>\s*([^<\s]*)')
+  tokens = []
+  for line in fileinput.input(fname):
+    tokens += elemPat.findall(line)
+    tokens += attrPat.findall(line)
+    tokens += valuPat.findall(line)
+  dict = {}
+  for tok in tokens:
+    dict[tok] = 1
+  result = list(dict.keys())
+  result.sort()
+  return result
+
+def processFile(preamble,tmplt,output,substs):
+  res = []
+  for subst in substs:
+    res.append(re.compile(subst[0]))
+  outf = open(output,"w")
+  for infile in [preamble,tmplt]:
+    for line in fileinput.input(infile):
+      count = 0
+      for r in res:
+        line = res[count].sub(substs[count][1],line,0)
+        count += 1
+      outf.write(line)
+  outf.close()
+
+def RNGTokenizerAction(target,source,env):
+  tgtDir = target[0].dir.path
+  ModulePath = re.sub(pjoin(env['BuildDir'],'hlvm','')+'(.*)','\\1',tgtDir)
+  Module = re.sub('[/\\\\]','_',ModulePath)
+  Schema = re.sub('.*/(.*).rng','\\1',source[0].path)
+  PreambleFile   = "utils/tmplt/Preamble_Code";
+  HeaderTemplate = "utils/tmplt/Tokenizer_Template.h";
+  SourceTemplate = "utils/tmplt/Tokenizer_Template.cpp";     
+  HeaderFile = pjoin(tgtDir,Schema) + "Tokenizer.h";
+  SourceFile = pjoin(tgtDir,Schema) + "Tokenizer.cpp";
+  TokenHashClass = Schema + "TokenHash";
+  TokenHashFile = pjoin(tgtDir,TokenHashClass) + ".i";
+  tokens = []
+  tokens = getSchemaTokens(source[0].path)
+  tknFilename = pjoin(tgtDir,Schema) + "Tokens.tmp"
+  tknFile = open(tknFilename,"w")
+  tknFile.write('struct TokenMap {\n')
+  tknFile.write('const char *name; hlvm::'+Schema+'Tokens token;\n')
+  tknFile.write('};\n%%\n')
+  for tkn in tokens:
+    tknFile.write('"' + tkn + '", hlvm::TKN_' + tkn + ',\n')
+  tknFile.write('%%\n')
+  tknFile.close()
+  gperfAction = env.Action(
+    "$GPERF -tcDCIoGl --fast 0 -L C++ -Z " + TokenHashClass +
+    " -s 2 -S 1 -k '*' " + tknFilename + " >" + TokenHashFile)
+  env.Execute(gperfAction)
+  tokenList = "TKN_"
+  for tkn in tokens:
+    tokenList += "TKN_" + tkn + ",\n    "
+  from datetime import date
+  substs = [
+    ['%SCHEMA_NAME%',Schema],
+    ['%AUTHOR%','Generated By HLVM build system'],
+    ['%DATE%',date.today().strftime('%c')],
+    ['%MODULE%',Module],
+    ['%MODULE_PATH%',ModulePath],
+    ['%TOKEN_LIST%',tokenList]
+  ]
+  processFile(PreambleFile,HeaderTemplate,HeaderFile,substs)
+  processFile(PreambleFile,SourceTemplate,SourceFile,substs)
+  return 0
+
+def RNGTokenizerMessage(target,source,env):
+  return "Generating Perfect Hash Tokenizer For " + source[0].path
+
+def RNGTokenizer(env):
+  a = env.Action(RNGTokenizerAction,RNGTokenizerMessage)
+  b = env.Builder(action=a,suffix='h',src_suffix='rng',single_source=1)
+  env.Append(BUILDERS = {'RNGTokenizer':b})
+

Modified: hlvm/trunk/scons/main.py
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/scons/main.py?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/scons/main.py (original)
+++ hlvm/trunk/scons/main.py Sat Jul  7 18:59:36 2007
@@ -1,9 +1,38 @@
 from SCons.Environment import Environment as Environment
 from environment import ProvisionEnvironment as ProvisionEnvironment
-def GetBuildEnvironment(targets):
+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 = ProvisionEnvironment(env)
-  if env['config'] == 1:
-    from configure import ConfigureHLVM as ConfigureHLVM
-    env = ConfigureHLVM(env)
-  return env
+  env['HLVM_Copyright'] = 'Copyright (c) 2006 Reid Spencer'
+  env['HLVM_Maintainer'] = 'Reid Spencer <rspencer at 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 join(one,two):
+  return path.join([one,two])

Modified: hlvm/trunk/tools/SConscript
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/tools/SConscript?rev=38076&r1=38075&r2=38076&view=diff

==============================================================================
--- hlvm/trunk/tools/SConscript (original)
+++ hlvm/trunk/tools/SConscript Sat Jul  7 18:59:36 2007
@@ -1,3 +1,4 @@
-SConscript([
+Import('env')
+env.SConscript([
   'hlvm-xml2xml/SConscript'
 ])

Added: hlvm/trunk/tools/hlvm-xml2xml/SConscript
URL: http://llvm.org/viewvc/llvm-project/hlvm/trunk/tools/hlvm-xml2xml/SConscript?rev=38076&view=auto

==============================================================================
--- hlvm/trunk/tools/hlvm-xml2xml/SConscript (added)
+++ hlvm/trunk/tools/hlvm-xml2xml/SConscript Sat Jul  7 18:59:36 2007
@@ -0,0 +1,4 @@
+from scons import main
+Import('env')
+env.Program('hlvm-xml2xml', main.GetAllCXXFiles(env),
+ LIBS=['HLVMAST','HLVMXMLReader','HLVMXMLWriter','HLVMBase','xml2','LLVMSupport'])





More information about the llvm-commits mailing list