SConscript revision 8453:82fc1267d3bb
19850Sandreas.hansson@arm.com# -*- mode:python -*-
29850Sandreas.hansson@arm.com
39850Sandreas.hansson@arm.com# Copyright (c) 2009 The Hewlett-Packard Development Company
49850Sandreas.hansson@arm.com# All rights reserved.
59850Sandreas.hansson@arm.com#
69850Sandreas.hansson@arm.com# Redistribution and use in source and binary forms, with or without
79850Sandreas.hansson@arm.com# modification, are permitted provided that the following conditions are
89850Sandreas.hansson@arm.com# met: redistributions of source code must retain the above copyright
99850Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer;
109850Sandreas.hansson@arm.com# redistributions in binary form must reproduce the above copyright
119850Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer in the
129850Sandreas.hansson@arm.com# documentation and/or other materials provided with the distribution;
139850Sandreas.hansson@arm.com# neither the name of the copyright holders nor the names of its
149850Sandreas.hansson@arm.com# contributors may be used to endorse or promote products derived from
159850Sandreas.hansson@arm.com# this software without specific prior written permission.
169850Sandreas.hansson@arm.com#
179850Sandreas.hansson@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
189850Sandreas.hansson@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
199850Sandreas.hansson@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
209850Sandreas.hansson@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
219850Sandreas.hansson@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
229850Sandreas.hansson@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
239850Sandreas.hansson@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
249850Sandreas.hansson@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
259850Sandreas.hansson@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
269850Sandreas.hansson@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
279850Sandreas.hansson@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
289850Sandreas.hansson@arm.com#
299850Sandreas.hansson@arm.com# Authors: Nathan Binkert
309850Sandreas.hansson@arm.com
319850Sandreas.hansson@arm.comimport os
329850Sandreas.hansson@arm.comimport re
339850Sandreas.hansson@arm.comimport sys
349850Sandreas.hansson@arm.com
359850Sandreas.hansson@arm.comfrom os.path import isdir, isfile, join as joinpath
369850Sandreas.hansson@arm.com
379850Sandreas.hansson@arm.comfrom SCons.Scanner import Classic
389850Sandreas.hansson@arm.com
397768SN/AImport('*')
407768SN/A
417768SN/Aif not env['RUBY']:
429850Sandreas.hansson@arm.com    Return()
43
44protocol_dir = Dir('.')
45html_dir = Dir('html')
46slicc_dir = Dir('../slicc')
47
48sys.path[1:1] = [ Dir('..').srcnode().abspath ]
49from slicc.parser import SLICC
50
51slicc_depends = []
52for root,dirs,files in os.walk(slicc_dir.srcnode().abspath):
53    for f in files:
54        if f.endswith('.py'):
55            slicc_depends.append(File(joinpath(root, f)))
56
57#
58# Use SLICC
59#
60env['SLICC_PATH'] = str(protocol_dir)
61slicc_scanner = Classic("SliccScanner", ['.sm', '.slicc'], "SLICC_PATH",
62                        r'''include[ \t]["'](.*)["'];''')
63env.Append(SCANNERS=slicc_scanner)
64
65def slicc_emitter(target, source, env):
66    protocol = source[0].get_contents()
67    files = [s.srcnode().abspath for s in source[1:]]
68    slicc = SLICC(protocol, verbose=False)
69    slicc.load(files)
70    slicc.process()
71    slicc.writeCodeFiles(protocol_dir.abspath)
72    if not env['NO_HTML']:
73        slicc.writeHTMLFiles(html_dir.abspath)
74
75    target.extend([protocol_dir.File(f) for f in sorted(slicc.files())])
76    return target, source
77
78def slicc_action(target, source, env):
79    protocol = source[0].get_contents()
80    files = [s.srcnode().abspath for s in source[1:]]
81    slicc = SLICC(protocol, verbose=True)
82    slicc.load(files)
83    slicc.process()
84    slicc.writeCodeFiles(protocol_dir.abspath)
85    if not env['NO_HTML']:
86        slicc.writeHTMLFiles(html_dir.abspath)
87
88slicc_builder = Builder(action=MakeAction(slicc_action, Transform("SLICC")),
89                        emitter=slicc_emitter)
90
91protocol = env['PROTOCOL']
92sources = [ protocol_dir.File("RubySlicc_interfaces.slicc"),
93            protocol_dir.File("%s.slicc" % protocol) ]
94
95env.Append(BUILDERS={'SLICC' : slicc_builder})
96nodes = env.SLICC([], [ Value(protocol) ] + sources)
97env.Depends(nodes, slicc_depends)
98
99for f in nodes:
100    s = str(f)
101    if s.endswith('.cc'):
102        Source(f)
103    elif s.endswith('.py'):
104        SimObject(f)
105
106