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)