diff options
author | sgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-21 06:04:04 +0000 |
---|---|---|
committer | sgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-21 06:04:04 +0000 |
commit | 11e020fcd65c415dc46d10ae9dbe6ba63600ee4c (patch) | |
tree | cddd284203c70dc51f60da67b71b73ce7ec4aff8 /site_scons | |
parent | 140d59c7cfa01e2d6a644091c29dcad9010c0e66 (diff) | |
download | chromium_src-11e020fcd65c415dc46d10ae9dbe6ba63600ee4c.zip chromium_src-11e020fcd65c415dc46d10ae9dbe6ba63600ee4c.tar.gz chromium_src-11e020fcd65c415dc46d10ae9dbe6ba63600ee4c.tar.bz2 |
Fix use of LOAD= with WantSystemLib() (we could blow up if a variable
hadn't been added to the config) and extend use of LOAD= into submodules:
* Add a ChromeLoadSConscriptModules() method that encapsulates the
conditional logic, and makes things more readable by specifying
component names as keyword arguments, not hard-coding the logic
as a series of if-tests.
* Put the ChromeLoadSConscriptModules() logic in a Tool module in
site_scons/site_tools, so it doesn't clutter up
build/SConscript.main directly.
* Move env.WantSystemLib() calls into the individual *.scons files,
so we call them each time (or not, based one LOAD=) and the config
itself just returns if the system library is requested and we
don't need to build anything locally.
* Move the settings where a library name changes based on whether or
not the system lib is being used into the using_*.scons files,
so they're available to clients independently of whether or not the
component's *.scons configuration is loaded.
* While here: rename the affected third_party SConscript files:
third_party/libjpeg/SConscript => third_party/libjpeg/libjpeg.scons
third_party/libxml/SConscript => third_party/libxml/libxml.scons
third_party/libxslt/SConscript => third_party/libxslt/libxslt.scons
* While here: move the Chrome{Program,SharedLibrary}() etc. builder
definitions from build/SConscript.main to a new too
Ad the ChromeLoadSConscriptModules() logic in a Tool module,
to remove more clutter from build/SConscript.main.
Review URL: http://codereview.chromium.org/11430
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@5820 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'site_scons')
-rw-r--r-- | site_scons/site_tools/chromium_builders.py | 35 | ||||
-rw-r--r-- | site_scons/site_tools/chromium_load_component.py | 81 |
2 files changed, 116 insertions, 0 deletions
diff --git a/site_scons/site_tools/chromium_builders.py b/site_scons/site_tools/chromium_builders.py new file mode 100644 index 0000000..a5c3964 --- /dev/null +++ b/site_scons/site_tools/chromium_builders.py @@ -0,0 +1,35 @@ +# 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. + +""" +Tool module for adding, to a construction environment, Chromium-specific +wrappers around Hammer builders. This gives us a central place for any +customization we need to make to the different things we build. +""" + +def generate(env): + def ChromeProgram(env, *args, **kw): + return env.ComponentProgram(*args, **kw) + env.AddMethod(ChromeProgram) + + def ChromeTestProgram(env, *args, **kw): + return env.ComponentTestProgram(*args, **kw) + env.AddMethod(ChromeTestProgram) + + def ChromeStaticLibrary(env, *args, **kw): + kw['COMPONENT_STATIC'] = True + return env.ComponentLibrary(*args, **kw) + env.AddMethod(ChromeStaticLibrary) + + def ChromeSharedLibrary(env, *args, **kw): + kw['COMPONENT_STATIC'] = False + return [env.ComponentLibrary(*args, **kw)[0]] + env.AddMethod(ChromeSharedLibrary) + + def ChromeObject(env, *args, **kw): + return env.ComponentObject(*args, **kw) + env.AddMethod(ChromeObject) + +def exists(env): + return True diff --git a/site_scons/site_tools/chromium_load_component.py b/site_scons/site_tools/chromium_load_component.py new file mode 100644 index 0000000..24c6e03 --- /dev/null +++ b/site_scons/site_tools/chromium_load_component.py @@ -0,0 +1,81 @@ +# 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. + +""" +Tool module for managing conditional loading of components in a +Chromium build (i.e., the LOAD= command-line argument). +""" + +from SCons.Script import * + +def generate(env): + + class LoadComponent: + """ + Class for deciding if a given component name is to be included + based on a list of included names, optionally prefixed with '-' + to exclude the name. + """ + def __init__(self, load=[], names=[]): + """ + Initialize a class with a list of names for possible loading. + + Arguments: + load: list of elements in the LOAD= specification + names: name(s) that represent this global collection + """ + self.included = set([c for c in load if not c.startswith('-')]) + self.excluded = set([c[1:] for c in load if c.startswith('-')]) + + # Remove the global collection name(s) from the included list. + # This supports (e.g.) specifying 'webkit' so the top-level of the + # hierarchy will read up the subsystem, and then 'test_shell' + # as one specific sub-component within 'webkit'. + self.included = self.included - set(names) + + if not self.included: + self.included = ['all'] + + def __call__(self, component): + """ + Returns True if the specified component should be loaded, + based on the initialized included and excluded lists. + """ + return (component in self.included or + ('all' in self.included and not component in self.excluded)) + + def ChromiumLoadComponentSConscripts(env, *args, **kw): + """ + Returns a list of SConscript files to load, based on LOAD=. + + SConscript files specified without keyword arguments are returned + unconditionally. SConscript files specified with a keyword arguments + (e.g. chrome = 'chrome.scons') are loaded only if the LOAD= line + indicates their keyword argument should be included in the load. + """ + try: + load = ARGUMENTS.get('LOAD').split(',') + except AttributeError: + load = [] + + try: + names = kw['LOAD_NAMES'] + except KeyError: + names = [] + else: + del kw['LOAD_NAMES'] + + load_component = LoadComponent(load, names) + + result = list(args) + for module, sconscript in kw.items(): + if load_component(module): + result.append(sconscript) + + return Flatten(result) + + env.AddMethod(ChromiumLoadComponentSConscripts) + +def exists(env): + return True |