Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1696)

Side by Side Diff: pylib/gyp/__init__.py

Issue 10911082: Load target build files in parallel using Python multiprocessing. (Closed) Base URL: http://git.chromium.org/external/gyp.git@master
Patch Set: Put behind flag with env var Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pylib/gyp/input.py » ('j') | pylib/gyp/input.py » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 2
3 # Copyright (c) 2012 Google Inc. All rights reserved. 3 # Copyright (c) 2012 Google Inc. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be 4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file. 5 # found in the LICENSE file.
6 6
7 import copy 7 import copy
8 import gyp.input 8 import gyp.input
9 import optparse 9 import optparse
10 import os.path 10 import os.path
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 45
46 46
47 class GypError(Exception): 47 class GypError(Exception):
48 """Error class representing an error, which is to be presented 48 """Error class representing an error, which is to be presented
49 to the user. The main entry point will catch and display this. 49 to the user. The main entry point will catch and display this.
50 """ 50 """
51 pass 51 pass
52 52
53 53
54 def Load(build_files, format, default_variables={}, 54 def Load(build_files, format, default_variables={},
55 includes=[], depth='.', params=None, check=False, circular_check=True): 55 includes=[], depth='.', params=None, check=False,
56 circular_check=True, parallel=False):
56 """ 57 """
57 Loads one or more specified build files. 58 Loads one or more specified build files.
58 default_variables and includes will be copied before use. 59 default_variables and includes will be copied before use.
59 Returns the generator for the specified format and the 60 Returns the generator for the specified format and the
60 data returned by loading the specified build files. 61 data returned by loading the specified build files.
61 """ 62 """
62 if params is None: 63 if params is None:
63 params = {} 64 params = {}
64 65
65 flavor = None 66 flavor = None
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 getattr(generator, 'generator_supports_multiple_toolsets', False), 124 getattr(generator, 'generator_supports_multiple_toolsets', False),
124 'generator_wants_static_library_dependencies_adjusted': 125 'generator_wants_static_library_dependencies_adjusted':
125 getattr(generator, 126 getattr(generator,
126 'generator_wants_static_library_dependencies_adjusted', True), 127 'generator_wants_static_library_dependencies_adjusted', True),
127 'generator_wants_sorted_dependencies': 128 'generator_wants_sorted_dependencies':
128 getattr(generator, 'generator_wants_sorted_dependencies', False), 129 getattr(generator, 'generator_wants_sorted_dependencies', False),
129 } 130 }
130 131
131 # Process the input specific to this generator. 132 # Process the input specific to this generator.
132 result = gyp.input.Load(build_files, default_variables, includes[:], 133 result = gyp.input.Load(build_files, default_variables, includes[:],
133 depth, generator_input_info, check, circular_check) 134 depth, generator_input_info, check, circular_check,
135 parallel)
134 return [generator] + result 136 return [generator] + result
135 137
136 def NameValueListToDict(name_value_list): 138 def NameValueListToDict(name_value_list):
137 """ 139 """
138 Takes an array of strings of the form 'NAME=VALUE' and creates a dictionary 140 Takes an array of strings of the form 'NAME=VALUE' and creates a dictionary
139 of the pairs. If a string is simply NAME, then the value in the dictionary 141 of the pairs. If a string is simply NAME, then the value in the dictionary
140 is set to True. If VALUE can be converted to an integer, it is. 142 is set to True. If VALUE can be converted to an integer, it is.
141 """ 143 """
142 result = { } 144 result = { }
143 for item in name_value_list: 145 for item in name_value_list:
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 help='sets generator flag FLAG to VAL') 312 help='sets generator flag FLAG to VAL')
311 parser.add_option('--generator-output', dest='generator_output', 313 parser.add_option('--generator-output', dest='generator_output',
312 action='store', default=None, metavar='DIR', type='path', 314 action='store', default=None, metavar='DIR', type='path',
313 env_name='GYP_GENERATOR_OUTPUT', 315 env_name='GYP_GENERATOR_OUTPUT',
314 help='puts generated build files under DIR') 316 help='puts generated build files under DIR')
315 parser.add_option('--ignore-environment', dest='use_environment', 317 parser.add_option('--ignore-environment', dest='use_environment',
316 action='store_false', default=True, regenerate=False, 318 action='store_false', default=True, regenerate=False,
317 help='do not read options from environment variables') 319 help='do not read options from environment variables')
318 parser.add_option('--check', dest='check', action='store_true', 320 parser.add_option('--check', dest='check', action='store_true',
319 help='check format of gyp files') 321 help='check format of gyp files')
322 parser.add_option('--parallel', dest='parallel', action='store_true',
M-A Ruel 2012/09/18 19:42:18 Remove parameter dest='parallel' it's not needed.
dmazzoni 2012/09/19 21:14:52 Done.
323 env_name='GYP_PARALLEL',
324 regenerate=False,
M-A Ruel 2012/09/18 19:42:18 What's regenerate?
dmazzoni 2012/09/19 21:14:52 Looks like this isn't needed if 'dest' isn't used.
325 help='Use multiprocessing for speed (experimental)')
320 parser.add_option('--toplevel-dir', dest='toplevel_dir', action='store', 326 parser.add_option('--toplevel-dir', dest='toplevel_dir', action='store',
321 default=None, metavar='DIR', type='path', 327 default=None, metavar='DIR', type='path',
322 help='directory to use as the root of the source tree') 328 help='directory to use as the root of the source tree')
323 # --no-circular-check disables the check for circular relationships between 329 # --no-circular-check disables the check for circular relationships between
324 # .gyp files. These relationships should not exist, but they've only been 330 # .gyp files. These relationships should not exist, but they've only been
325 # observed to be harmful with the Xcode generator. Chromium's .gyp files 331 # observed to be harmful with the Xcode generator. Chromium's .gyp files
326 # currently have some circular relationships on non-Mac platforms, so this 332 # currently have some circular relationships on non-Mac platforms, so this
327 # option allows the strict behavior to be used on Macs and the lenient 333 # option allows the strict behavior to be used on Macs and the lenient
328 # behavior to be used elsewhere. 334 # behavior to be used elsewhere.
329 # TODO(mark): Remove this option when http://crbug.com/35878 is fixed. 335 # TODO(mark): Remove this option when http://crbug.com/35878 is fixed.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 elif sys.platform in ('win32', 'cygwin'): 373 elif sys.platform in ('win32', 'cygwin'):
368 options.formats = ['msvs'] 374 options.formats = ['msvs']
369 else: 375 else:
370 options.formats = ['make'] 376 options.formats = ['make']
371 377
372 if not options.generator_output and options.use_environment: 378 if not options.generator_output and options.use_environment:
373 g_o = os.environ.get('GYP_GENERATOR_OUTPUT') 379 g_o = os.environ.get('GYP_GENERATOR_OUTPUT')
374 if g_o: 380 if g_o:
375 options.generator_output = g_o 381 options.generator_output = g_o
376 382
383 if not options.parallel and options.use_environment:
384 parallel = os.environ.get('GYP_PARALLEL')
M-A Ruel 2012/09/18 19:42:18 options.parallel = bool(os.environ.get('GYP_PARALL
dmazzoni 2012/09/19 21:14:52 Done.
385 if parallel:
386 options.parallel = True
387
377 for mode in options.debug: 388 for mode in options.debug:
378 gyp.debug[mode] = 1 389 gyp.debug[mode] = 1
379 390
380 # Do an extra check to avoid work when we're not debugging. 391 # Do an extra check to avoid work when we're not debugging.
381 if DEBUG_GENERAL in gyp.debug.keys(): 392 if DEBUG_GENERAL in gyp.debug.keys():
382 DebugOutput(DEBUG_GENERAL, 'running with these options:') 393 DebugOutput(DEBUG_GENERAL, 'running with these options:')
383 for option, value in sorted(options.__dict__.items()): 394 for option, value in sorted(options.__dict__.items()):
384 if option[0] == '_': 395 if option[0] == '_':
385 continue 396 continue
386 if isinstance(value, basestring): 397 if isinstance(value, basestring):
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 'cwd': os.getcwd(), 495 'cwd': os.getcwd(),
485 'build_files_arg': build_files_arg, 496 'build_files_arg': build_files_arg,
486 'gyp_binary': sys.argv[0], 497 'gyp_binary': sys.argv[0],
487 'home_dot_gyp': home_dot_gyp} 498 'home_dot_gyp': home_dot_gyp}
488 499
489 # Start with the default variables from the command line. 500 # Start with the default variables from the command line.
490 [generator, flat_list, targets, data] = Load(build_files, format, 501 [generator, flat_list, targets, data] = Load(build_files, format,
491 cmdline_default_variables, 502 cmdline_default_variables,
492 includes, options.depth, 503 includes, options.depth,
493 params, options.check, 504 params, options.check,
494 options.circular_check) 505 options.circular_check,
506 options.parallel)
495 507
496 # TODO(mark): Pass |data| for now because the generator needs a list of 508 # TODO(mark): Pass |data| for now because the generator needs a list of
497 # build files that came in. In the future, maybe it should just accept 509 # build files that came in. In the future, maybe it should just accept
498 # a list, and not the whole data dict. 510 # a list, and not the whole data dict.
499 # NOTE: flat_list is the flattened dependency graph specifying the order 511 # NOTE: flat_list is the flattened dependency graph specifying the order
500 # that targets may be built. Build systems that operate serially or that 512 # that targets may be built. Build systems that operate serially or that
501 # need to have dependencies defined before dependents reference them should 513 # need to have dependencies defined before dependents reference them should
502 # generate targets in the order specified in flat_list. 514 # generate targets in the order specified in flat_list.
503 generator.GenerateOutput(flat_list, targets, data, params) 515 generator.GenerateOutput(flat_list, targets, data, params)
504 516
505 # Done 517 # Done
506 return 0 518 return 0
507 519
508 520
509 def main(args): 521 def main(args):
510 try: 522 try:
511 return gyp_main(args) 523 return gyp_main(args)
512 except GypError, e: 524 except GypError, e:
513 sys.stderr.write("gyp: %s\n" % e) 525 sys.stderr.write("gyp: %s\n" % e)
514 return 1 526 return 1
515 527
516 if __name__ == '__main__': 528 if __name__ == '__main__':
517 sys.exit(main(sys.argv[1:])) 529 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | pylib/gyp/input.py » ('j') | pylib/gyp/input.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698