32a33
> import re
100,105d100
< # Several files are generated from the ISA description.
< # We always get the basic decoder and header file.
< target = [ 'decoder.cc', 'decoder.hh', 'max_inst_regs.hh' ]
< # We also get an execute file for each selected CPU model.
< target += [CpuModel.dict[cpu].filename for cpu in cpu_models]
<
111c106,121
< return [os.path.join("generated", t) for t in target], source
---
> # Specify different targets depending on if we're running the ISA
> # parser for its dependency information, or for the generated files.
> # (As an optimization, the ISA parser detects the useless second run
> # and skips doing any work, if the first run was performed, since it
> # always generates all its files). The way we track this in SCons is the
> # <arch>_isa_outputs value in the environment (env). If it's unset, we
> # don't know what the dependencies are so we ask for generated/inc.d to
> # be generated so they can be acquired. If we know what they are, then
> # it's because we've already processed inc.d and then claim that our
> # outputs (targets) will be thus.
> isa = env['TARGET_ISA']
> key = '%s_isa_outputs' % isa
> if key in env:
> targets = [ os.path.join('generated', f) for f in env[key] ]
> else:
> targets = [ os.path.join('generated','inc.d') ]
112a123,127
> def prefix(s):
> return os.path.join(target[0].dir.up().abspath, s)
>
> return [ prefix(t) for t in targets ], source
>
135a151,197
> # The ISA is generated twice: the first time to find out what it generates,
> # and the second time to make scons happy by telling the ISADesc builder
> # what it will make before it builds it.
> def scan_isa_deps(target, source, env):
> # Process dependency file generated by the ISA parser --
> # add the listed files to the dependency tree of the build.
> source = source[0]
> archbase = source.dir.up().path
>
> try:
> depfile = open(source.abspath, 'r')
> except:
> print "scan_isa_deps: Can't open ISA deps file '%s' in %s" % \
> (source.path,os.getcwd())
> raise
>
> # Scan through the lines
> targets = {}
> for line in depfile:
> # Read the dependency line with the format
> # <target file>: [ <dependent file>* ]
> m = re.match(r'^\s*([^:]+\.([^\.:]+))\s*:\s*(.*)', line)
> assert(m)
> targ, extn = m.group(1,2)
> deps = m.group(3).split()
>
> files = [ targ ] + deps
> for f in files:
> targets[f] = True
> # Eliminate unnecessary re-generation if we already generated it
> env.Precious(os.path.join(archbase, 'generated', f))
>
> files = [ os.path.join(archbase, 'generated', f) for f in files ]
>
> if extn == 'cc':
> Source(os.path.join(archbase,'generated', targ))
> depfile.close()
> env[env['TARGET_ISA'] + '_isa_outputs'] = targets.keys()
>
> isa = env.ISADesc(os.path.join(archbase,'isa','main.isa'))
> for t in targets:
> env.Depends('#all-isas', isa)
>
> env.Append(BUILDERS = {'ScanISA' :
> Builder(action=MakeAction(scan_isa_deps,
> Transform("NEW DEPS", 1)))})
>