OLD | NEW |
1 # Copyright (c) 2013 Google Inc. All rights reserved. | 1 # Copyright (c) 2013 Google Inc. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
| 5 from __future__ import print_function |
| 6 |
5 import collections | 7 import collections |
6 import copy | 8 import copy |
7 import hashlib | 9 import hashlib |
8 import json | 10 import json |
9 import multiprocessing | 11 import multiprocessing |
10 import os.path | 12 import os.path |
11 import re | 13 import re |
12 import signal | 14 import signal |
13 import subprocess | 15 import subprocess |
14 import sys | 16 import sys |
15 import gyp | 17 import gyp |
16 import gyp.common | 18 import gyp.common |
17 from gyp.common import OrderedSet | 19 from gyp.common import OrderedSet |
18 import gyp.msvs_emulation | 20 import gyp.msvs_emulation |
19 import gyp.MSVSUtil as MSVSUtil | 21 import gyp.MSVSUtil as MSVSUtil |
20 import gyp.xcode_emulation | 22 import gyp.xcode_emulation |
21 from cStringIO import StringIO | 23 try: |
| 24 from cStringIO import StringIO |
| 25 except ImportError: |
| 26 from io import StringIO |
22 | 27 |
23 from gyp.common import GetEnvironFallback | 28 from gyp.common import GetEnvironFallback |
24 import gyp.ninja_syntax as ninja_syntax | 29 import gyp.ninja_syntax as ninja_syntax |
25 | 30 |
26 generator_default_variables = { | 31 generator_default_variables = { |
27 'EXECUTABLE_PREFIX': '', | 32 'EXECUTABLE_PREFIX': '', |
28 'EXECUTABLE_SUFFIX': '', | 33 'EXECUTABLE_SUFFIX': '', |
29 'STATIC_LIB_PREFIX': 'lib', | 34 'STATIC_LIB_PREFIX': 'lib', |
30 'STATIC_LIB_SUFFIX': '.a', | 35 'STATIC_LIB_SUFFIX': '.a', |
31 'SHARED_LIB_PREFIX': 'lib', | 36 'SHARED_LIB_PREFIX': 'lib', |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 path_basename = self.name + '.' + path_basename | 345 path_basename = self.name + '.' + path_basename |
341 return os.path.normpath(os.path.join(obj, self.base_dir, path_dir, | 346 return os.path.normpath(os.path.join(obj, self.base_dir, path_dir, |
342 path_basename)) | 347 path_basename)) |
343 | 348 |
344 def WriteCollapsedDependencies(self, name, targets, order_only=None): | 349 def WriteCollapsedDependencies(self, name, targets, order_only=None): |
345 """Given a list of targets, return a path for a single file | 350 """Given a list of targets, return a path for a single file |
346 representing the result of building all the targets or None. | 351 representing the result of building all the targets or None. |
347 | 352 |
348 Uses a stamp file if necessary.""" | 353 Uses a stamp file if necessary.""" |
349 | 354 |
350 assert targets == filter(None, targets), targets | 355 assert targets == [t for t in targets if t], targets |
351 if len(targets) == 0: | 356 if len(targets) == 0: |
352 assert not order_only | 357 assert not order_only |
353 return None | 358 return None |
354 if len(targets) > 1 or order_only: | 359 if len(targets) > 1 or order_only: |
355 stamp = self.GypPathToUniqueOutput(name + '.stamp') | 360 stamp = self.GypPathToUniqueOutput(name + '.stamp') |
356 targets = self.ninja.build(stamp, 'stamp', targets, order_only=order_only) | 361 targets = self.ninja.build(stamp, 'stamp', targets, order_only=order_only) |
357 self.ninja.newline() | 362 self.ninja.newline() |
358 return targets[0] | 363 return targets[0] |
359 | 364 |
360 def _SubninjaNameForArch(self, arch): | 365 def _SubninjaNameForArch(self, arch): |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 actions_depends = [] | 423 actions_depends = [] |
419 compile_depends = [] | 424 compile_depends = [] |
420 # TODO(evan): it is rather confusing which things are lists and which | 425 # TODO(evan): it is rather confusing which things are lists and which |
421 # are strings. Fix these. | 426 # are strings. Fix these. |
422 if 'dependencies' in spec: | 427 if 'dependencies' in spec: |
423 for dep in spec['dependencies']: | 428 for dep in spec['dependencies']: |
424 if dep in self.target_outputs: | 429 if dep in self.target_outputs: |
425 target = self.target_outputs[dep] | 430 target = self.target_outputs[dep] |
426 actions_depends.append(target.PreActionInput(self.flavor)) | 431 actions_depends.append(target.PreActionInput(self.flavor)) |
427 compile_depends.append(target.PreCompileInput()) | 432 compile_depends.append(target.PreCompileInput()) |
428 actions_depends = filter(None, actions_depends) | 433 actions_depends = [d for d in actions_depends if d] |
429 compile_depends = filter(None, compile_depends) | 434 compile_depends = [d for d in compile_depends if d] |
430 actions_depends = self.WriteCollapsedDependencies('actions_depends', | 435 actions_depends = self.WriteCollapsedDependencies('actions_depends', |
431 actions_depends) | 436 actions_depends) |
432 compile_depends = self.WriteCollapsedDependencies('compile_depends', | 437 compile_depends = self.WriteCollapsedDependencies('compile_depends', |
433 compile_depends) | 438 compile_depends) |
434 self.target.preaction_stamp = actions_depends | 439 self.target.preaction_stamp = actions_depends |
435 self.target.precompile_stamp = compile_depends | 440 self.target.precompile_stamp = compile_depends |
436 | 441 |
437 # Write out actions, rules, and copies. These must happen before we | 442 # Write out actions, rules, and copies. These must happen before we |
438 # compile any sources, so compute a list of predependencies for sources | 443 # compile any sources, so compute a list of predependencies for sources |
439 # while we do it. | 444 # while we do it. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang)) | 476 lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang)) |
472 link_deps = self.WriteSources( | 477 link_deps = self.WriteSources( |
473 self.ninja, config_name, config, sources, compile_depends_stamp, pch, | 478 self.ninja, config_name, config, sources, compile_depends_stamp, pch, |
474 spec) | 479 spec) |
475 # Some actions/rules output 'sources' that are already object files. | 480 # Some actions/rules output 'sources' that are already object files. |
476 obj_outputs = [f for f in sources if f.endswith(self.obj_ext)] | 481 obj_outputs = [f for f in sources if f.endswith(self.obj_ext)] |
477 if obj_outputs: | 482 if obj_outputs: |
478 if self.flavor != 'mac' or len(self.archs) == 1: | 483 if self.flavor != 'mac' or len(self.archs) == 1: |
479 link_deps += [self.GypPathToNinja(o) for o in obj_outputs] | 484 link_deps += [self.GypPathToNinja(o) for o in obj_outputs] |
480 else: | 485 else: |
481 print "Warning: Actions/rules writing object files don't work with " \ | 486 print("Warning: Actions/rules writing object files don't work with " \ |
482 "multiarch targets, dropping. (target %s)" % spec['target_name'] | 487 "multiarch targets, dropping. (target %s)" % spec['target_name']
) |
483 elif self.flavor == 'mac' and len(self.archs) > 1: | 488 elif self.flavor == 'mac' and len(self.archs) > 1: |
484 link_deps = collections.defaultdict(list) | 489 link_deps = collections.defaultdict(list) |
485 | 490 |
486 compile_deps = self.target.actions_stamp or actions_depends | 491 compile_deps = self.target.actions_stamp or actions_depends |
487 if self.flavor == 'win' and self.target.type == 'static_library': | 492 if self.flavor == 'win' and self.target.type == 'static_library': |
488 self.target.component_objs = link_deps | 493 self.target.component_objs = link_deps |
489 self.target.compile_deps = compile_deps | 494 self.target.compile_deps = compile_deps |
490 | 495 |
491 # Write out a link step, if needed. | 496 # Write out a link step, if needed. |
492 output = None | 497 output = None |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
824 at each invocation of ninja.""" | 829 at each invocation of ninja.""" |
825 if not xcassets: | 830 if not xcassets: |
826 return | 831 return |
827 | 832 |
828 extra_arguments = {} | 833 extra_arguments = {} |
829 settings_to_arg = { | 834 settings_to_arg = { |
830 'XCASSETS_APP_ICON': 'app-icon', | 835 'XCASSETS_APP_ICON': 'app-icon', |
831 'XCASSETS_LAUNCH_IMAGE': 'launch-image', | 836 'XCASSETS_LAUNCH_IMAGE': 'launch-image', |
832 } | 837 } |
833 settings = self.xcode_settings.xcode_settings[self.config_name] | 838 settings = self.xcode_settings.xcode_settings[self.config_name] |
834 for settings_key, arg_name in settings_to_arg.iteritems(): | 839 for settings_key, arg_name in settings_to_arg.items(): |
835 value = settings.get(settings_key) | 840 value = settings.get(settings_key) |
836 if value: | 841 if value: |
837 extra_arguments[arg_name] = value | 842 extra_arguments[arg_name] = value |
838 | 843 |
839 partial_info_plist = None | 844 partial_info_plist = None |
840 if extra_arguments: | 845 if extra_arguments: |
841 partial_info_plist = self.GypPathToUniqueOutput( | 846 partial_info_plist = self.GypPathToUniqueOutput( |
842 'assetcatalog_generated_info.plist') | 847 'assetcatalog_generated_info.plist') |
843 extra_arguments['output-partial-info-plist'] = partial_info_plist | 848 extra_arguments['output-partial-info-plist'] = partial_info_plist |
844 | 849 |
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1754 ("ullAvailVirtual", ctypes.c_ulonglong), | 1759 ("ullAvailVirtual", ctypes.c_ulonglong), |
1755 ("sullAvailExtendedVirtual", ctypes.c_ulonglong), | 1760 ("sullAvailExtendedVirtual", ctypes.c_ulonglong), |
1756 ] | 1761 ] |
1757 | 1762 |
1758 stat = MEMORYSTATUSEX() | 1763 stat = MEMORYSTATUSEX() |
1759 stat.dwLength = ctypes.sizeof(stat) | 1764 stat.dwLength = ctypes.sizeof(stat) |
1760 ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat)) | 1765 ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat)) |
1761 | 1766 |
1762 # VS 2015 uses 20% more working set than VS 2013 and can consume all RAM | 1767 # VS 2015 uses 20% more working set than VS 2013 and can consume all RAM |
1763 # on a 64 GB machine. | 1768 # on a 64 GB machine. |
1764 mem_limit = max(1, stat.ullTotalPhys / (5 * (2 ** 30))) # total / 5GB | 1769 mem_limit = max(1, stat.ullTotalPhys // (5 * (2 ** 30))) # total / 5GB |
1765 hard_cap = max(1, int(os.environ.get('GYP_LINK_CONCURRENCY_MAX', 2**32))) | 1770 hard_cap = max(1, int(os.environ.get('GYP_LINK_CONCURRENCY_MAX', 2**32))) |
1766 return min(mem_limit, hard_cap) | 1771 return min(mem_limit, hard_cap) |
1767 elif sys.platform.startswith('linux'): | 1772 elif sys.platform.startswith('linux'): |
1768 if os.path.exists("/proc/meminfo"): | 1773 if os.path.exists("/proc/meminfo"): |
1769 with open("/proc/meminfo") as meminfo: | 1774 with open("/proc/meminfo") as meminfo: |
1770 memtotal_re = re.compile(r'^MemTotal:\s*(\d*)\s*kB') | 1775 memtotal_re = re.compile(r'^MemTotal:\s*(\d*)\s*kB') |
1771 for line in meminfo: | 1776 for line in meminfo: |
1772 match = memtotal_re.match(line) | 1777 match = memtotal_re.match(line) |
1773 if not match: | 1778 if not match: |
1774 continue | 1779 continue |
1775 # Allow 8Gb per link on Linux because Gold is quite memory hungry | 1780 # Allow 8Gb per link on Linux because Gold is quite memory hungry |
1776 return max(1, int(match.group(1)) / (8 * (2 ** 20))) | 1781 return max(1, int(match.group(1)) // (8 * (2 ** 20))) |
1777 return 1 | 1782 return 1 |
1778 elif sys.platform == 'darwin': | 1783 elif sys.platform == 'darwin': |
1779 try: | 1784 try: |
1780 avail_bytes = int(subprocess.check_output(['sysctl', '-n', 'hw.memsize'])) | 1785 avail_bytes = int(subprocess.check_output(['sysctl', '-n', 'hw.memsize'])) |
1781 # A static library debug build of Chromium's unit_tests takes ~2.7GB, so | 1786 # A static library debug build of Chromium's unit_tests takes ~2.7GB, so |
1782 # 4GB per ld process allows for some more bloat. | 1787 # 4GB per ld process allows for some more bloat. |
1783 return max(1, avail_bytes / (4 * (2 ** 30))) # total / 4GB | 1788 return max(1, avail_bytes // (4 * (2 ** 30))) # total / 4GB |
1784 except: | 1789 except: |
1785 return 1 | 1790 return 1 |
1786 else: | 1791 else: |
1787 # TODO(scottmg): Implement this for other platforms. | 1792 # TODO(scottmg): Implement this for other platforms. |
1788 return 1 | 1793 return 1 |
1789 | 1794 |
1790 | 1795 |
1791 def _GetWinLinkRuleNameSuffix(embed_manifest): | 1796 def _GetWinLinkRuleNameSuffix(embed_manifest): |
1792 """Returns the suffix used to select an appropriate linking rule depending on | 1797 """Returns the suffix used to select an appropriate linking rule depending on |
1793 whether the manifest embedding is enabled.""" | 1798 whether the manifest embedding is enabled.""" |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1928 if key == 'NM.host': | 1933 if key == 'NM.host': |
1929 nm_host = os.path.join(build_to_root, value) | 1934 nm_host = os.path.join(build_to_root, value) |
1930 if key == 'READELF': | 1935 if key == 'READELF': |
1931 readelf = os.path.join(build_to_root, value) | 1936 readelf = os.path.join(build_to_root, value) |
1932 if key == 'READELF.host': | 1937 if key == 'READELF.host': |
1933 readelf_host = os.path.join(build_to_root, value) | 1938 readelf_host = os.path.join(build_to_root, value) |
1934 if key.endswith('_wrapper'): | 1939 if key.endswith('_wrapper'): |
1935 wrappers[key[:-len('_wrapper')]] = os.path.join(build_to_root, value) | 1940 wrappers[key[:-len('_wrapper')]] = os.path.join(build_to_root, value) |
1936 | 1941 |
1937 # Support wrappers from environment variables too. | 1942 # Support wrappers from environment variables too. |
1938 for key, value in os.environ.iteritems(): | 1943 for key, value in os.environ.items(): |
1939 if key.lower().endswith('_wrapper'): | 1944 if key.lower().endswith('_wrapper'): |
1940 key_prefix = key[:-len('_wrapper')] | 1945 key_prefix = key[:-len('_wrapper')] |
1941 key_prefix = re.sub(r'\.HOST$', '.host', key_prefix) | 1946 key_prefix = re.sub(r'\.HOST$', '.host', key_prefix) |
1942 wrappers[key_prefix] = os.path.join(build_to_root, value) | 1947 wrappers[key_prefix] = os.path.join(build_to_root, value) |
1943 | 1948 |
1944 mac_toolchain_dir = generator_flags.get('mac_toolchain_dir', None) | 1949 mac_toolchain_dir = generator_flags.get('mac_toolchain_dir', None) |
1945 if mac_toolchain_dir: | 1950 if mac_toolchain_dir: |
1946 wrappers['LINK'] = "export DEVELOPER_DIR='%s' &&" % mac_toolchain_dir | 1951 wrappers['LINK'] = "export DEVELOPER_DIR='%s' &&" % mac_toolchain_dir |
1947 | 1952 |
1948 if flavor == 'win': | 1953 if flavor == 'win': |
1949 configs = [target_dicts[qualified_target]['configurations'][config_name] | 1954 configs = [target_dicts[qualified_target]['configurations'][config_name] |
1950 for qualified_target in target_list] | 1955 for qualified_target in target_list] |
1951 shared_system_includes = None | 1956 shared_system_includes = None |
1952 if not generator_flags.get('ninja_use_custom_environment_files', 0): | 1957 if not generator_flags.get('ninja_use_custom_environment_files', 0): |
1953 shared_system_includes = \ | 1958 shared_system_includes = \ |
1954 gyp.msvs_emulation.ExtractSharedMSVSSystemIncludes( | 1959 gyp.msvs_emulation.ExtractSharedMSVSSystemIncludes( |
1955 configs, generator_flags) | 1960 configs, generator_flags) |
1956 cl_paths = gyp.msvs_emulation.GenerateEnvironmentFiles( | 1961 cl_paths = gyp.msvs_emulation.GenerateEnvironmentFiles( |
1957 toplevel_build, generator_flags, shared_system_includes, OpenOutput) | 1962 toplevel_build, generator_flags, shared_system_includes, OpenOutput) |
1958 for arch, path in sorted(cl_paths.iteritems()): | 1963 for arch, path in sorted(cl_paths.items()): |
1959 if clang_cl: | 1964 if clang_cl: |
1960 # If we have selected clang-cl, use that instead. | 1965 # If we have selected clang-cl, use that instead. |
1961 path = clang_cl | 1966 path = clang_cl |
1962 command = CommandWithWrapper('CC', wrappers, | 1967 command = CommandWithWrapper('CC', wrappers, |
1963 QuoteShellArgument(path, 'win')) | 1968 QuoteShellArgument(path, 'win')) |
1964 if clang_cl: | 1969 if clang_cl: |
1965 # Use clang-cl to cross-compile for x86 or x86_64. | 1970 # Use clang-cl to cross-compile for x86 or x86_64. |
1966 command += (' -m32' if arch == 'x86' else ' -m64') | 1971 command += (' -m32' if arch == 'x86' else ' -m64') |
1967 master_ninja.variable('cl_' + arch, command) | 1972 master_ninja.variable('cl_' + arch, command) |
1968 | 1973 |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2356 gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec) | 2361 gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec) |
2357 | 2362 |
2358 # If build_file is a symlink, we must not follow it because there's a chance | 2363 # If build_file is a symlink, we must not follow it because there's a chance |
2359 # it could point to a path above toplevel_dir, and we cannot correctly deal | 2364 # it could point to a path above toplevel_dir, and we cannot correctly deal |
2360 # with that case at the moment. | 2365 # with that case at the moment. |
2361 build_file = gyp.common.RelativePath(build_file, options.toplevel_dir, | 2366 build_file = gyp.common.RelativePath(build_file, options.toplevel_dir, |
2362 False) | 2367 False) |
2363 | 2368 |
2364 qualified_target_for_hash = gyp.common.QualifiedTarget(build_file, name, | 2369 qualified_target_for_hash = gyp.common.QualifiedTarget(build_file, name, |
2365 toolset) | 2370 toolset) |
| 2371 qualified_target_for_hash = qualified_target_for_hash.encode('utf-8') |
2366 hash_for_rules = hashlib.md5(qualified_target_for_hash).hexdigest() | 2372 hash_for_rules = hashlib.md5(qualified_target_for_hash).hexdigest() |
2367 | 2373 |
2368 base_path = os.path.dirname(build_file) | 2374 base_path = os.path.dirname(build_file) |
2369 obj = 'obj' | 2375 obj = 'obj' |
2370 if toolset != 'target': | 2376 if toolset != 'target': |
2371 obj += '.' + toolset | 2377 obj += '.' + toolset |
2372 output_file = os.path.join(obj, base_path, name + '.ninja') | 2378 output_file = os.path.join(obj, base_path, name + '.ninja') |
2373 | 2379 |
2374 ninja_output = StringIO() | 2380 ninja_output = StringIO() |
2375 writer = NinjaWriter(hash_for_rules, target_outputs, base_path, build_dir, | 2381 writer = NinjaWriter(hash_for_rules, target_outputs, base_path, build_dir, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2422 master_ninja.default(generator_flags.get('default_target', 'all')) | 2428 master_ninja.default(generator_flags.get('default_target', 'all')) |
2423 | 2429 |
2424 master_ninja_file.close() | 2430 master_ninja_file.close() |
2425 | 2431 |
2426 | 2432 |
2427 def PerformBuild(data, configurations, params): | 2433 def PerformBuild(data, configurations, params): |
2428 options = params['options'] | 2434 options = params['options'] |
2429 for config in configurations: | 2435 for config in configurations: |
2430 builddir = os.path.join(options.toplevel_dir, 'out', config) | 2436 builddir = os.path.join(options.toplevel_dir, 'out', config) |
2431 arguments = ['ninja', '-C', builddir] | 2437 arguments = ['ninja', '-C', builddir] |
2432 print 'Building [%s]: %s' % (config, arguments) | 2438 print('Building [%s]: %s' % (config, arguments)) |
2433 subprocess.check_call(arguments) | 2439 subprocess.check_call(arguments) |
2434 | 2440 |
2435 | 2441 |
2436 def CallGenerateOutputForConfig(arglist): | 2442 def CallGenerateOutputForConfig(arglist): |
2437 # Ignore the interrupt signal so that the parent process catches it and | 2443 # Ignore the interrupt signal so that the parent process catches it and |
2438 # kills all multiprocessing children. | 2444 # kills all multiprocessing children. |
2439 signal.signal(signal.SIGINT, signal.SIG_IGN) | 2445 signal.signal(signal.SIGINT, signal.SIG_IGN) |
2440 | 2446 |
2441 (target_list, target_dicts, data, params, config_name) = arglist | 2447 (target_list, target_dicts, data, params, config_name) = arglist |
2442 GenerateOutputForConfig(target_list, target_dicts, data, params, config_name) | 2448 GenerateOutputForConfig(target_list, target_dicts, data, params, config_name) |
2443 | 2449 |
2444 | 2450 |
2445 def GenerateOutput(target_list, target_dicts, data, params): | 2451 def GenerateOutput(target_list, target_dicts, data, params): |
2446 # Update target_dicts for iOS device builds. | 2452 # Update target_dicts for iOS device builds. |
2447 target_dicts = gyp.xcode_emulation.CloneConfigurationForDeviceAndEmulator( | 2453 target_dicts = gyp.xcode_emulation.CloneConfigurationForDeviceAndEmulator( |
2448 target_dicts) | 2454 target_dicts) |
2449 | 2455 |
2450 user_config = params.get('generator_flags', {}).get('config', None) | 2456 user_config = params.get('generator_flags', {}).get('config', None) |
2451 if gyp.common.GetFlavor(params) == 'win': | 2457 if gyp.common.GetFlavor(params) == 'win': |
2452 target_list, target_dicts = MSVSUtil.ShardTargets(target_list, target_dicts) | 2458 target_list, target_dicts = MSVSUtil.ShardTargets(target_list, target_dicts) |
2453 target_list, target_dicts = MSVSUtil.InsertLargePdbShims( | 2459 target_list, target_dicts = MSVSUtil.InsertLargePdbShims( |
2454 target_list, target_dicts, generator_default_variables) | 2460 target_list, target_dicts, generator_default_variables) |
2455 | 2461 |
2456 if user_config: | 2462 if user_config: |
2457 GenerateOutputForConfig(target_list, target_dicts, data, params, | 2463 GenerateOutputForConfig(target_list, target_dicts, data, params, |
2458 user_config) | 2464 user_config) |
2459 else: | 2465 else: |
2460 config_names = target_dicts[target_list[0]]['configurations'].keys() | 2466 config_names = target_dicts[target_list[0]]['configurations'] |
2461 if params['parallel']: | 2467 if params['parallel']: |
2462 try: | 2468 try: |
2463 pool = multiprocessing.Pool(len(config_names)) | 2469 pool = multiprocessing.Pool(len(config_names)) |
2464 arglists = [] | 2470 arglists = [] |
2465 for config_name in config_names: | 2471 for config_name in config_names: |
2466 arglists.append( | 2472 arglists.append( |
2467 (target_list, target_dicts, data, params, config_name)) | 2473 (target_list, target_dicts, data, params, config_name)) |
2468 pool.map(CallGenerateOutputForConfig, arglists) | 2474 pool.map(CallGenerateOutputForConfig, arglists) |
2469 except KeyboardInterrupt, e: | 2475 except KeyboardInterrupt as e: |
2470 pool.terminate() | 2476 pool.terminate() |
2471 raise e | 2477 raise e |
2472 else: | 2478 else: |
2473 for config_name in config_names: | 2479 for config_name in config_names: |
2474 GenerateOutputForConfig(target_list, target_dicts, data, params, | 2480 GenerateOutputForConfig(target_list, target_dicts, data, params, |
2475 config_name) | 2481 config_name) |
OLD | NEW |