1# This file is generated; do not edit.
2
3__doc__ = '''
4Wrapper configuration for building this entire "solution,"
5including all the specific targets in various *.scons files.
6'''
7
8import os
9import sys
10
11import SCons.Environment
12import SCons.Util
13
14def GetProcessorCount():
15  '''
16  Detects the number of CPUs on the system. Adapted form:
17  http://codeliberates.blogspot.com/2008/05/detecting-cpuscores-in-python.html
18  '''
19  # Linux, Unix and Mac OS X:
20  if hasattr(os, 'sysconf'):
21    if os.sysconf_names.has_key('SC_NPROCESSORS_ONLN'):
22      # Linux and Unix or Mac OS X with python >= 2.5:
23      return os.sysconf('SC_NPROCESSORS_ONLN')
24    else:  # Mac OS X with Python < 2.5:
25      return int(os.popen2("sysctl -n hw.ncpu")[1].read())
26  # Windows:
27  if os.environ.has_key('NUMBER_OF_PROCESSORS'):
28    return max(int(os.environ.get('NUMBER_OF_PROCESSORS', '1')), 1)
29  return 1  # Default
30
31# Support PROGRESS= to show progress in different ways.
32p = ARGUMENTS.get('PROGRESS')
33if p == 'spinner':
34  Progress(['/\r', '|\r', '\\\r', '-\r'],
35           interval=5,
36           file=open('/dev/tty', 'w'))
37elif p == 'name':
38  Progress('$TARGET\r', overwrite=True, file=open('/dev/tty', 'w'))
39
40# Set the default -j value based on the number of processors.
41SetOption('num_jobs', GetProcessorCount() + 1)
42
43# Have SCons use its cached dependency information.
44SetOption('implicit_cache', 1)
45
46# Only re-calculate MD5 checksums if a timestamp has changed.
47Decider('MD5-timestamp')
48
49# Since we set the -j value by default, suppress SCons warnings about being
50# unable to support parallel build on versions of Python with no threading.
51default_warnings = ['no-no-parallel-support']
52SetOption('warn', default_warnings + GetOption('warn'))
53
54AddOption('--mode', nargs=1, dest='conf_list', default=[],
55          action='append', help='Configuration to build.')
56
57AddOption('--verbose', dest='verbose', default=False,
58          action='store_true', help='Verbose command-line output.')
59
60
61#
62sconscript_file_map = dict(
63    base = 'base.scons',
64    base_i18n = 'base_i18n.scons',
65    base_unittests = 'base_unittests.scons',
66    gmock = '../testing/gmock.scons',
67    gtest = '../testing/gtest.scons',
68    icudata = '../third_party/icu/icudata.scons',
69    icui18n = '../third_party/icu/icui18n.scons',
70    icuuc = '../third_party/icu/icuuc.scons',
71    lastchange = '../build/util/lastchange.scons',
72    libevent = '../third_party/libevent/libevent.scons',
73    linux_versioninfo = 'linux_versioninfo.scons',
74    test_support_base = 'test_support_base.scons',
75    test_support_perf = 'test_support_perf.scons',
76    xdisplaycheck = '../tools/xdisplaycheck/xdisplaycheck.scons',
77)
78
79class LoadTarget:
80  '''
81  Class for deciding if a given target sconscript is to be included
82  based on a list of included target names, optionally prefixed with '-'
83  to exclude a target name.
84  '''
85  def __init__(self, load):
86    '''
87    Initialize a class with a list of names for possible loading.
88
89    Arguments:
90      load:  list of elements in the LOAD= specification
91    '''
92    self.included = set([c for c in load if not c.startswith('-')])
93    self.excluded = set([c[1:] for c in load if c.startswith('-')])
94
95    if not self.included:
96      self.included = set(['all'])
97
98  def __call__(self, target):
99    '''
100    Returns True if the specified target's sconscript file should be
101    loaded, based on the initialized included and excluded lists.
102    '''
103    return (target in self.included or
104            ('all' in self.included and not target in self.excluded))
105
106if 'LOAD' in ARGUMENTS:
107  load = ARGUMENTS['LOAD'].split(',')
108else:
109  load = []
110load_target = LoadTarget(load)
111
112sconscript_files = []
113for target, sconscript in sconscript_file_map.iteritems():
114  if load_target(target):
115    sconscript_files.append(sconscript)
116
117
118target_alias_list= []
119
120conf_list = GetOption('conf_list')
121if conf_list:
122    # In case the same --mode= value was specified multiple times.
123    conf_list = list(set(conf_list))
124else:
125    conf_list = ['Debug']
126
127sconsbuild_dir = Dir('../sconsbuild')
128
129
130def FilterOut(self, **kw):
131  kw = SCons.Environment.copy_non_reserved_keywords(kw)
132  for key, val in kw.items():
133    envval = self.get(key, None)
134    if envval is None:
135      # No existing variable in the environment, so nothing to delete.
136      continue
137
138    for vremove in val:
139      # Use while not if, so we can handle duplicates.
140      while vremove in envval:
141        envval.remove(vremove)
142
143    self[key] = envval
144
145    # TODO(sgk): SCons.Environment.Append() has much more logic to deal
146    # with various types of values.  We should handle all those cases in here
147    # too.  (If variable is a dict, etc.)
148
149
150non_compilable_suffixes = {
151    'LINUX' : set([
152        '.bdic',
153        '.css',
154        '.dat',
155        '.fragment',
156        '.gperf',
157        '.h',
158        '.hh',
159        '.hpp',
160        '.html',
161        '.hxx',
162        '.idl',
163        '.in',
164        '.in0',
165        '.in1',
166        '.js',
167        '.mk',
168        '.rc',
169        '.sigs',
170        '',
171    ]),
172    'WINDOWS' : set([
173        '.h',
174        '.hh',
175        '.hpp',
176        '.dat',
177        '.idl',
178        '.in',
179        '.in0',
180        '.in1',
181    ]),
182}
183
184def compilable(env, file):
185  base, ext = os.path.splitext(str(file))
186  if ext in non_compilable_suffixes[env['TARGET_PLATFORM']]:
187    return False
188  return True
189
190def compilable_files(env, sources):
191  return [x for x in sources if compilable(env, x)]
192
193def GypProgram(env, target, source, *args, **kw):
194  source = compilable_files(env, source)
195  result = env.Program('$TOP_BUILDDIR/' + str(target), source, *args, **kw)
196  if env.get('INCREMENTAL'):
197    env.Precious(result)
198  return result
199
200def GypTestProgram(env, target, source, *args, **kw):
201  source = compilable_files(env, source)
202  result = env.Program('$TOP_BUILDDIR/' + str(target), source, *args, **kw)
203  if env.get('INCREMENTAL'):
204    env.Precious(*result)
205  return result
206
207def GypLibrary(env, target, source, *args, **kw):
208  source = compilable_files(env, source)
209  result = env.Library('$LIB_DIR/' + str(target), source, *args, **kw)
210  return result
211
212def GypLoadableModule(env, target, source, *args, **kw):
213  source = compilable_files(env, source)
214  result = env.LoadableModule('$TOP_BUILDDIR/' + str(target), source, *args,
215                              **kw)
216  return result
217
218def GypStaticLibrary(env, target, source, *args, **kw):
219  source = compilable_files(env, source)
220  result = env.StaticLibrary('$LIB_DIR/' + str(target), source, *args, **kw)
221  return result
222
223def GypSharedLibrary(env, target, source, *args, **kw):
224  source = compilable_files(env, source)
225  result = env.SharedLibrary('$LIB_DIR/' + str(target), source, *args, **kw)
226  if env.get('INCREMENTAL'):
227    env.Precious(result)
228  return result
229
230def add_gyp_methods(env):
231  env.AddMethod(GypProgram)
232  env.AddMethod(GypTestProgram)
233  env.AddMethod(GypLibrary)
234  env.AddMethod(GypLoadableModule)
235  env.AddMethod(GypStaticLibrary)
236  env.AddMethod(GypSharedLibrary)
237
238  env.AddMethod(FilterOut)
239
240  env.AddMethod(compilable)
241
242
243base_env = Environment(
244    tools = ['ar', 'as', 'gcc', 'g++', 'gnulink', 'chromium_builders'],
245    INTERMEDIATE_DIR='$OBJ_DIR/${COMPONENT_NAME}/_${TARGET_NAME}_intermediate',
246    LIB_DIR='$TOP_BUILDDIR/lib',
247    OBJ_DIR='$TOP_BUILDDIR/obj',
248    SCONSBUILD_DIR=sconsbuild_dir.abspath,
249    SHARED_INTERMEDIATE_DIR='$OBJ_DIR/_global_intermediate',
250    SRC_DIR=Dir('..'),
251    TARGET_PLATFORM='LINUX',
252    TOP_BUILDDIR='$SCONSBUILD_DIR/$CONFIG_NAME',
253    LIBPATH=['$LIB_DIR'],
254)
255
256if not GetOption('verbose'):
257  base_env.SetDefault(
258      ARCOMSTR='Creating library $TARGET',
259      ASCOMSTR='Assembling $TARGET',
260      CCCOMSTR='Compiling $TARGET',
261      CONCATSOURCECOMSTR='ConcatSource $TARGET',
262      CXXCOMSTR='Compiling $TARGET',
263      LDMODULECOMSTR='Building loadable module $TARGET',
264      LINKCOMSTR='Linking $TARGET',
265      MANIFESTCOMSTR='Updating manifest for $TARGET',
266      MIDLCOMSTR='Compiling IDL $TARGET',
267      PCHCOMSTR='Precompiling $TARGET',
268      RANLIBCOMSTR='Indexing $TARGET',
269      RCCOMSTR='Compiling resource $TARGET',
270      SHCCCOMSTR='Compiling $TARGET',
271      SHCXXCOMSTR='Compiling $TARGET',
272      SHLINKCOMSTR='Linking $TARGET',
273      SHMANIFESTCOMSTR='Updating manifest for $TARGET',
274  )
275
276add_gyp_methods(base_env)
277
278for conf in conf_list:
279  env = base_env.Clone(CONFIG_NAME=conf)
280  SConsignFile(env.File('$TOP_BUILDDIR/.sconsign').abspath)
281  for sconscript in sconscript_files:
282    target_alias = env.SConscript(sconscript, exports=['env'])
283    if target_alias:
284      target_alias_list.extend(target_alias)
285
286Default(Alias('all', target_alias_list))
287
288help_fmt = '''
289Usage: hammer [SCONS_OPTIONS] [VARIABLES] [TARGET] ...
290
291Local command-line build options:
292  --mode=CONFIG             Configuration to build:
293                              --mode=Debug [default]
294                              --mode=Release
295  --verbose                 Print actual executed command lines.
296
297Supported command-line build variables:
298  LOAD=[module,...]         Comma-separated list of components to load in the
299                              dependency graph ('-' prefix excludes)
300  PROGRESS=type             Display a progress indicator:
301                              name:  print each evaluated target name
302                              spinner:  print a spinner every 5 targets
303
304The following TARGET names can also be used as LOAD= module names:
305
306%s
307'''
308
309if GetOption('help'):
310  def columnar_text(items, width=78, indent=2, sep=2):
311    result = []
312    colwidth = max(map(len, items)) + sep
313    cols = (width - indent) / colwidth
314    if cols < 1:
315      cols = 1
316    rows = (len(items) + cols - 1) / cols
317    indent = '%*s' % (indent, '')
318    sep = indent
319    for row in xrange(0, rows):
320      result.append(sep)
321      for i in xrange(row, len(items), rows):
322        result.append('%-*s' % (colwidth, items[i]))
323      sep = '\n' + indent
324    result.append('\n')
325    return ''.join(result)
326
327  load_list = set(sconscript_file_map.keys())
328  target_aliases = set(map(str, target_alias_list))
329
330  common = load_list and target_aliases
331  load_only = load_list - common
332  target_only = target_aliases - common
333  help_text = [help_fmt % columnar_text(sorted(list(common)))]
334  if target_only:
335    fmt = "The following are additional TARGET names:\n\n%s\n"
336    help_text.append(fmt % columnar_text(sorted(list(target_only))))
337  if load_only:
338    fmt = "The following are additional LOAD= module names:\n\n%s\n"
339    help_text.append(fmt % columnar_text(sorted(list(load_only))))
340  Help(''.join(help_text))
341