| Index: tools/grit/grit/scons.py
|
| diff --git a/tools/grit/grit/scons.py b/tools/grit/grit/scons.py
|
| deleted file mode 100644
|
| index 479824236cc10f71b1861fc264782f4c4ace9125..0000000000000000000000000000000000000000
|
| --- a/tools/grit/grit/scons.py
|
| +++ /dev/null
|
| @@ -1,199 +0,0 @@
|
| -#!/usr/bin/python2.4
|
| -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -'''SCons integration for GRIT.
|
| -'''
|
| -
|
| -# NOTE: DO NOT IMPORT ANY GRIT STUFF HERE - we import lazily so that grit and
|
| -# its dependencies aren't imported until actually needed.
|
| -
|
| -import os
|
| -import types
|
| -
|
| -import SCons.Errors
|
| -
|
| -def _IsDebugEnabled():
|
| - return 'GRIT_DEBUG' in os.environ and os.environ['GRIT_DEBUG'] == '1'
|
| -
|
| -def _SourceToFile(source):
|
| - '''Return the path to the source file, given the 'source' argument as provided
|
| - by SCons to the _Builder or _Emitter functions.
|
| - '''
|
| - # Get the filename of the source. The 'source' parameter can be a string,
|
| - # a "node", or a list of strings or nodes.
|
| - if isinstance(source, types.ListType):
|
| - # TODO(gspencer): Had to add the .rfile() method to the following
|
| - # line to get this to work with Repository() directories.
|
| - # Get this functionality folded back into the upstream grit tool.
|
| - #source = str(source[0])
|
| - for s in source:
|
| - if str(s.rfile()).endswith('.grd'):
|
| - return str(s.rfile())
|
| - else:
|
| - # TODO(gspencer): Had to add the .rfile() method to the following
|
| - # line to get this to work with Repository() directories.
|
| - # Get this functionality folded back into the upstream grit tool.
|
| - #source = str(source))
|
| - source = str(source.rfile())
|
| - return source
|
| -
|
| -
|
| -def _Builder(target, source, env):
|
| - # We fork GRIT into a separate process so we can use more processes between
|
| - # scons and GRIT. This already runs as separate threads, but because of the
|
| - # python GIL, all these threads have to share the same process. By using
|
| - # fork, we can use multiple processes and processors.
|
| - pid = os.fork()
|
| - if pid != 0:
|
| - pid, exit_code = os.waitpid(pid, 0)
|
| - if exit_code != 0:
|
| - raise SCons.Errors.BuildError(errstr="see grit error")
|
| - return
|
| - try:
|
| - try:
|
| - child_exit_code = 0
|
| - from grit import grit_runner
|
| - from grit.tool import build
|
| - options = grit_runner.Options()
|
| - # This sets options to default values.
|
| - options.ReadOptions(['-v'])
|
| - options.input = _SourceToFile(source)
|
| -
|
| - # TODO(joi) Check if we can get the 'verbose' option from the environment.
|
| -
|
| - builder = build.RcBuilder()
|
| -
|
| - # Get the CPP defines from the environment.
|
| - for flag in env.get('RCFLAGS', []):
|
| - if flag.startswith('/D'):
|
| - flag = flag[2:]
|
| - name, val = build.ParseDefine(flag)
|
| - # Only apply to first instance of a given define
|
| - if name not in builder.defines:
|
| - builder.defines[name] = val
|
| -
|
| - # To ensure that our output files match what we promised SCons, we
|
| - # use the list of targets provided by SCons and update the file paths in
|
| - # our .grd input file with the targets.
|
| - builder.scons_targets = [str(t) for t in target]
|
| - builder.Run(options, [])
|
| - except:
|
| - child_exit_code = -1
|
| - finally:
|
| - # Exit the child process.
|
| - os._exit(child_exit_code)
|
| -
|
| -
|
| -def _Emitter(target, source, env):
|
| - '''A SCons emitter for .grd files, which modifies the list of targes to
|
| - include all files in the <outputs> section of the .grd file as well as
|
| - any other files output by 'grit build' for the .grd file.
|
| - '''
|
| - from grit import grd_reader
|
| - from grit import util
|
| -
|
| - # TODO(gspencer): Had to use .abspath, not str(target[0]), to get
|
| - # this to work with Repository() directories.
|
| - # Get this functionality folded back into the upstream grit tool.
|
| - #base_dir = util.dirname(str(target[0]))
|
| - base_dir = util.dirname(target[0].abspath)
|
| -
|
| - grd = grd_reader.Parse(_SourceToFile(source), debug=_IsDebugEnabled())
|
| -
|
| - target = []
|
| - lang_folders = {}
|
| - # Add all explicitly-specified output files
|
| - for output in grd.GetOutputFiles():
|
| - path = os.path.join(base_dir, output.GetFilename())
|
| - target.append(path)
|
| -
|
| - if path.endswith('.h'):
|
| - path, filename = os.path.split(path)
|
| - if _IsDebugEnabled():
|
| - print "GRIT: Added target %s" % path
|
| - if output.attrs['lang'] != '':
|
| - lang_folders[output.attrs['lang']] = os.path.dirname(path)
|
| -
|
| - # Add all generated files, once for each output language.
|
| - for node in grd:
|
| - if node.name == 'structure':
|
| - # TODO(joi) Should remove the "if sconsdep is true" thing as it is a
|
| - # hack - see grit/node/structure.py
|
| - if node.HasFileForLanguage() and node.attrs['sconsdep'] == 'true':
|
| - for lang in lang_folders:
|
| - path = node.FileForLanguage(lang, lang_folders[lang],
|
| - create_file=False,
|
| - return_if_not_generated=False)
|
| - if path:
|
| - target.append(path)
|
| - if _IsDebugEnabled():
|
| - print "GRIT: Added target %s" % path
|
| -
|
| - # return target and source lists
|
| - return (target, source)
|
| -
|
| -
|
| -def _Scanner(file_node, env, path):
|
| - '''A SCons scanner function for .grd files, which outputs the list of files
|
| - that changes in could change the output of building the .grd file.
|
| - '''
|
| - if not str(file_node.rfile()).endswith('.grd'):
|
| - return []
|
| -
|
| - from grit import grd_reader
|
| - # TODO(gspencer): Had to add the .rfile() method to the following
|
| - # line to get this to work with Repository() directories.
|
| - # Get this functionality folded back into the upstream grit tool.
|
| - #grd = grd_reader.Parse(str(file_node)), debug=_IsDebugEnabled())
|
| - grd = grd_reader.Parse(os.path.abspath(_SourceToFile(file_node)),
|
| - debug=_IsDebugEnabled())
|
| - files = []
|
| - for node in grd:
|
| - if (node.name == 'structure' or node.name == 'skeleton' or
|
| - (node.name == 'file' and node.parent and
|
| - node.parent.name == 'translations')):
|
| - files.append(os.path.abspath(node.GetFilePath()))
|
| - elif node.name == 'include':
|
| - # Only include files that we actually plan on using.
|
| - if node.SatisfiesOutputCondition():
|
| - files.append(node.FilenameToOpen())
|
| -
|
| - # Add in the grit source files. If one of these change, we want to re-run
|
| - # grit.
|
| - grit_root_dir = env.subst('$CHROME_SRC_DIR/tools/grit')
|
| - for root, dirs, filenames in os.walk(grit_root_dir):
|
| - grit_src = [os.path.join(root, f) for f in filenames if f.endswith('.py')]
|
| - files.extend(grit_src)
|
| -
|
| - return files
|
| -
|
| -
|
| -def _BuildStr(targets, sources, env):
|
| - '''This message gets printed each time the builder runs.'''
|
| - return "Running GRIT on %s" % str(sources[0].rfile())
|
| -
|
| -
|
| -# Function name is mandated by newer versions of SCons.
|
| -def generate(env):
|
| - # The varlist parameter tells SCons that GRIT needs to be invoked again
|
| - # if RCFLAGS has changed since last compilation.
|
| -
|
| - # TODO(gspencer): change to use the public SCons API Action()
|
| - # and Builder(), instead of reaching directly into internal APIs.
|
| - # Get this change folded back into the upstream grit tool.
|
| - action = env.Action(_Builder, _BuildStr, varlist=['RCFLAGS'])
|
| -
|
| - scanner = env.Scanner(function=_Scanner, name='GRIT scanner', skeys=['.grd'])
|
| -
|
| - builder = env.Builder(action=action, emitter=_Emitter,
|
| - source_scanner=scanner,
|
| - src_suffix='.grd')
|
| -
|
| - # add our builder and scanner to the environment
|
| - env.Append(BUILDERS = {'GRIT': builder})
|
| -
|
| -# Function name is mandated by newer versions of SCons.
|
| -def exists(env):
|
| - return 1
|
|
|