summaryrefslogtreecommitdiffstats
path: root/site_scons
diff options
context:
space:
mode:
authorsgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-21 06:04:04 +0000
committersgk@google.com <sgk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-21 06:04:04 +0000
commit11e020fcd65c415dc46d10ae9dbe6ba63600ee4c (patch)
treecddd284203c70dc51f60da67b71b73ce7ec4aff8 /site_scons
parent140d59c7cfa01e2d6a644091c29dcad9010c0e66 (diff)
downloadchromium_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.py35
-rw-r--r--site_scons/site_tools/chromium_load_component.py81
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