SConscript (6655:380a32b43336) | SConscript (6657:ef5fae93a3b2) |
---|---|
1# -*- mode:python -*- 2 3# Copyright (c) 2009 The Hewlett-Packard Development Company 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are 8# met: redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28# 29# Authors: Nathan Binkert 30 31import os | 1# -*- mode:python -*- 2 3# Copyright (c) 2009 The Hewlett-Packard Development Company 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are 8# met: redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28# 29# Authors: Nathan Binkert 30 31import os |
32import re 33import string | |
34import sys 35 | 32import sys 33 |
36from os.path import basename, dirname, exists, expanduser, isdir, isfile 37from os.path import join as joinpath | 34from os.path import isdir, isfile, join as joinpath |
38 | 35 |
39import SCons 40 | |
41Import('*') 42 43if not env['RUBY']: 44 Return() 45 | 36Import('*') 37 38if not env['RUBY']: 39 Return() 40 |
46slicc_dir = Dir('../slicc') | |
47protocol_dir = Dir('.') 48html_dir = Dir('html') | 41protocol_dir = Dir('.') 42html_dir = Dir('html') |
43slicc_dir = Dir('../slicc') |
|
49 | 44 |
45sys.path[1:1] = [ Dir('..').srcnode().abspath ] 46from slicc.parser import SLICC 47 48slicc_depends = [] 49for root,dirs,files in os.walk(slicc_dir.srcnode().abspath): 50 for f in files: 51 if f.endswith('.py'): 52 slicc_depends.append(File(joinpath(root, f))) 53 |
|
50# 51# Use SLICC 52# | 54# 55# Use SLICC 56# |
53def slicc_generator(target, source, env, for_signature): 54 slicc_bin = str(source[0]) 55 protocol = source[1].get_contents() | 57 58def slicc_scanner(node, env, path): 59 contents = node.get_contents() 60 files = [ line.strip() for line in contents.splitlines() ] 61 return files 62 63env.Append(SCANNERS=Scanner(function=slicc_scanner,skeys=['.slicc'])) 64 65def slicc_emitter(target, source, env): 66 files = [s.srcnode().abspath for s in source[1:]] 67 slicc = SLICC(debug=True) 68 print "SLICC parsing..." 69 for name in slicc.load(files, verbose=True): 70 print " %s" % name 71 72 hh,cc = slicc.files() 73 target.extend(sorted(hh)) 74 target.extend(sorted(cc)) 75 f = file('/tmp/asdf', 'w') 76 for t in target: 77 print >>f, t 78 return target, source 79 80def slicc_action(target, source, env): 81 protocol = source[0].get_contents() |
56 pdir = str(protocol_dir) 57 hdir = str(html_dir) 58 59 if not isdir(pdir): 60 os.mkdir(pdir) 61 if not isdir(hdir): 62 os.mkdir(hdir) 63 | 82 pdir = str(protocol_dir) 83 hdir = str(html_dir) 84 85 if not isdir(pdir): 86 os.mkdir(pdir) 87 if not isdir(hdir): 88 os.mkdir(hdir) 89 |
64 do_html = "html" 65 cmdline = [ slicc_bin, pdir, hdir, protocol, do_html ] 66 cmdline += [ str(s) for s in source[2:] ] 67 cmdline = ' '.join(cmdline) 68 return cmdline | 90 slicc = SLICC(debug=True) 91 files = [str(s) for s in source[1:]] 92 slicc.load(files, verbose=False) |
69 | 93 |
70slicc_builder = Builder(generator=slicc_generator) | 94 print "SLICC Generator pass 1..." 95 slicc.findMachines() |
71 | 96 |
72protocol = env['PROTOCOL'] 73sources = [ protocol_dir.File("RubySlicc_interfaces.slicc"), 74 protocol_dir.File("%s.slicc" % protocol) ] | 97 print "SLICC Generator pass 2..." 98 slicc.generate() |
75 | 99 |
76execfile(slicc_dir.File('parser/parser.py').srcnode().abspath) | 100 print "SLICC writing C++ files..." 101 slicc.writeCodeFiles(pdir) |
77 | 102 |
78sm_files = read_slicc([s.srcnode().abspath for s in sources]) 79sm_files = [ protocol_dir.File(f) for f in sm_files ] | 103 print "SLICC writing HTML files..." 104 slicc.writeHTMLFiles(hdir) |
80 | 105 |
81hh, cc = scan([s.srcnode().abspath for s in sm_files]) 82hh = [ protocol_dir.File(f) for f in hh ] 83cc = [ protocol_dir.File(f) for f in cc ] | 106slicc_builder = Builder(action=slicc_action, emitter=slicc_emitter) |
84 | 107 |
85slicc_bin = slicc_dir.File("slicc") | 108protocol = env['PROTOCOL'] 109sources = [ protocol_dir.File("RubySlicc_interfaces.slicc"), 110 protocol_dir.File("%s.slicc" % protocol) ] |
86 87env.Append(BUILDERS={'SLICC' : slicc_builder}) | 111 112env.Append(BUILDERS={'SLICC' : slicc_builder}) |
88env.SLICC(hh + cc, [ slicc_bin, Value(protocol) ] + sm_files) | 113nodes = env.SLICC([], [ Value(protocol) ] + sources) 114env.Depends(nodes, slicc_depends) |
89 | 115 |
90for f in cc: | 116for f in sorted(s for s in nodes if str(s).endswith('.cc')): |
91 Source(f) | 117 Source(f) |