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

Side by Side Diff: pylib/gyp/generator/ninja.py

Issue 1410213005: win: Fix missing loadable_module dependency in ULDI mode (Closed) Base URL: https://chromium.googlesource.com/external/gyp.git@master
Patch Set: all-generators Created 5 years, 1 month 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 | test/dependencies/gyptest-indirect-module-dependency.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 import collections 5 import collections
6 import copy 6 import copy
7 import hashlib 7 import hashlib
8 import json 8 import json
9 import multiprocessing 9 import multiprocessing
10 import os.path 10 import os.path
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 self.precompile_stamp = None 132 self.precompile_stamp = None
133 # File representing the completion of actions/rules/copies, if any. 133 # File representing the completion of actions/rules/copies, if any.
134 self.actions_stamp = None 134 self.actions_stamp = None
135 # Path to the output of the link step, if any. 135 # Path to the output of the link step, if any.
136 self.binary = None 136 self.binary = None
137 # Path to the file representing the completion of building the bundle, 137 # Path to the file representing the completion of building the bundle,
138 # if any. 138 # if any.
139 self.bundle = None 139 self.bundle = None
140 # On Windows, incremental linking requires linking against all the .objs 140 # On Windows, incremental linking requires linking against all the .objs
141 # that compose a .lib (rather than the .lib itself). That list is stored 141 # that compose a .lib (rather than the .lib itself). That list is stored
142 # here. 142 # here. In this case, we also need to save the compile_deps for the target,
143 # so that the the target that directly depends on the .objs can also depend
144 # on those.
143 self.component_objs = None 145 self.component_objs = None
146 self.compile_deps = None
144 # Windows only. The import .lib is the output of a build step, but 147 # Windows only. The import .lib is the output of a build step, but
145 # because dependents only link against the lib (not both the lib and the 148 # because dependents only link against the lib (not both the lib and the
146 # dll) we keep track of the import library here. 149 # dll) we keep track of the import library here.
147 self.import_lib = None 150 self.import_lib = None
148 151
149 def Linkable(self): 152 def Linkable(self):
150 """Return true if this is a target that can be linked against.""" 153 """Return true if this is a target that can be linked against."""
151 return self.type in ('static_library', 'shared_library') 154 return self.type in ('static_library', 'shared_library')
152 155
153 def UsesToc(self, flavor): 156 def UsesToc(self, flavor):
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 obj_outputs = [f for f in sources if f.endswith(self.obj_ext)] 470 obj_outputs = [f for f in sources if f.endswith(self.obj_ext)]
468 if obj_outputs: 471 if obj_outputs:
469 if self.flavor != 'mac' or len(self.archs) == 1: 472 if self.flavor != 'mac' or len(self.archs) == 1:
470 link_deps += [self.GypPathToNinja(o) for o in obj_outputs] 473 link_deps += [self.GypPathToNinja(o) for o in obj_outputs]
471 else: 474 else:
472 print "Warning: Actions/rules writing object files don't work with " \ 475 print "Warning: Actions/rules writing object files don't work with " \
473 "multiarch targets, dropping. (target %s)" % spec['target_name'] 476 "multiarch targets, dropping. (target %s)" % spec['target_name']
474 elif self.flavor == 'mac' and len(self.archs) > 1: 477 elif self.flavor == 'mac' and len(self.archs) > 1:
475 link_deps = collections.defaultdict(list) 478 link_deps = collections.defaultdict(list)
476 479
477 480 compile_deps = self.target.actions_stamp or actions_depends
478 if self.flavor == 'win' and self.target.type == 'static_library': 481 if self.flavor == 'win' and self.target.type == 'static_library':
479 self.target.component_objs = link_deps 482 self.target.component_objs = link_deps
483 self.target.compile_deps = compile_deps
480 484
481 # Write out a link step, if needed. 485 # Write out a link step, if needed.
482 output = None 486 output = None
483 is_empty_bundle = not link_deps and not mac_bundle_depends 487 is_empty_bundle = not link_deps and not mac_bundle_depends
484 if link_deps or self.target.actions_stamp or actions_depends: 488 if link_deps or self.target.actions_stamp or actions_depends:
485 output = self.WriteTarget(spec, config_name, config, link_deps, 489 output = self.WriteTarget(spec, config_name, config, link_deps,
486 self.target.actions_stamp or actions_depends) 490 compile_deps)
487 if self.is_mac_bundle: 491 if self.is_mac_bundle:
488 mac_bundle_depends.append(output) 492 mac_bundle_depends.append(output)
489 493
490 # Bundle all of the above together, if needed. 494 # Bundle all of the above together, if needed.
491 if self.is_mac_bundle: 495 if self.is_mac_bundle:
492 output = self.WriteMacBundle(spec, mac_bundle_depends, is_empty_bundle) 496 output = self.WriteMacBundle(spec, mac_bundle_depends, is_empty_bundle)
493 497
494 if not output: 498 if not output:
495 return None 499 return None
496 500
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 """Write out a link step. Fills out target.binary. """ 1090 """Write out a link step. Fills out target.binary. """
1087 command = { 1091 command = {
1088 'executable': 'link', 1092 'executable': 'link',
1089 'loadable_module': 'solink_module', 1093 'loadable_module': 'solink_module',
1090 'shared_library': 'solink', 1094 'shared_library': 'solink',
1091 }[spec['type']] 1095 }[spec['type']]
1092 command_suffix = '' 1096 command_suffix = ''
1093 1097
1094 implicit_deps = set() 1098 implicit_deps = set()
1095 solibs = set() 1099 solibs = set()
1100 order_deps = set()
1096 1101
1097 if 'dependencies' in spec: 1102 if 'dependencies' in spec:
1098 # Two kinds of dependencies: 1103 # Two kinds of dependencies:
1099 # - Linkable dependencies (like a .a or a .so): add them to the link line. 1104 # - Linkable dependencies (like a .a or a .so): add them to the link line.
1100 # - Non-linkable dependencies (like a rule that generates a file 1105 # - Non-linkable dependencies (like a rule that generates a file
1101 # and writes a stamp file): add them to implicit_deps 1106 # and writes a stamp file): add them to implicit_deps
1102 extra_link_deps = set() 1107 extra_link_deps = set()
1103 for dep in spec['dependencies']: 1108 for dep in spec['dependencies']:
1104 target = self.target_outputs.get(dep) 1109 target = self.target_outputs.get(dep)
1105 if not target: 1110 if not target:
1106 continue 1111 continue
1107 linkable = target.Linkable() 1112 linkable = target.Linkable()
1108 if linkable: 1113 if linkable:
1109 new_deps = [] 1114 new_deps = []
1110 if (self.flavor == 'win' and 1115 if (self.flavor == 'win' and
1111 target.component_objs and 1116 target.component_objs and
1112 self.msvs_settings.IsUseLibraryDependencyInputs(config_name)): 1117 self.msvs_settings.IsUseLibraryDependencyInputs(config_name)):
1113 new_deps = target.component_objs 1118 new_deps = target.component_objs
1119 if target.compile_deps:
1120 order_deps.add(target.compile_deps)
1114 elif self.flavor == 'win' and target.import_lib: 1121 elif self.flavor == 'win' and target.import_lib:
1115 new_deps = [target.import_lib] 1122 new_deps = [target.import_lib]
1116 elif target.UsesToc(self.flavor): 1123 elif target.UsesToc(self.flavor):
1117 solibs.add(target.binary) 1124 solibs.add(target.binary)
1118 implicit_deps.add(target.binary + '.TOC') 1125 implicit_deps.add(target.binary + '.TOC')
1119 else: 1126 else:
1120 new_deps = [target.binary] 1127 new_deps = [target.binary]
1121 for new_dep in new_deps: 1128 for new_dep in new_deps:
1122 if new_dep not in extra_link_deps: 1129 if new_dep not in extra_link_deps:
1123 extra_link_deps.add(new_dep) 1130 extra_link_deps.add(new_dep)
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 config_name, self.ExpandSpecial, output + '.pdb') 1249 config_name, self.ExpandSpecial, output + '.pdb')
1243 if pdbname: 1250 if pdbname:
1244 output = [output, pdbname] 1251 output = [output, pdbname]
1245 1252
1246 1253
1247 if len(solibs): 1254 if len(solibs):
1248 extra_bindings.append(('solibs', gyp.common.EncodePOSIXShellList(solibs))) 1255 extra_bindings.append(('solibs', gyp.common.EncodePOSIXShellList(solibs)))
1249 1256
1250 ninja_file.build(output, command + command_suffix, link_deps, 1257 ninja_file.build(output, command + command_suffix, link_deps,
1251 implicit=list(implicit_deps), 1258 implicit=list(implicit_deps),
1259 order_only=list(order_deps),
1252 variables=extra_bindings) 1260 variables=extra_bindings)
1253 return linked_binary 1261 return linked_binary
1254 1262
1255 def WriteTarget(self, spec, config_name, config, link_deps, compile_deps): 1263 def WriteTarget(self, spec, config_name, config, link_deps, compile_deps):
1256 extra_link_deps = any(self.target_outputs.get(dep).Linkable() 1264 extra_link_deps = any(self.target_outputs.get(dep).Linkable()
1257 for dep in spec.get('dependencies', []) 1265 for dep in spec.get('dependencies', [])
1258 if dep in self.target_outputs) 1266 if dep in self.target_outputs)
1259 if spec['type'] == 'none' or (not link_deps and not extra_link_deps): 1267 if spec['type'] == 'none' or (not link_deps and not extra_link_deps):
1260 # TODO(evan): don't call this function for 'none' target types, as 1268 # TODO(evan): don't call this function for 'none' target types, as
1261 # it doesn't do anything, and we fake out a 'binary' with a stamp file. 1269 # it doesn't do anything, and we fake out a 'binary' with a stamp file.
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2393 arglists.append( 2401 arglists.append(
2394 (target_list, target_dicts, data, params, config_name)) 2402 (target_list, target_dicts, data, params, config_name))
2395 pool.map(CallGenerateOutputForConfig, arglists) 2403 pool.map(CallGenerateOutputForConfig, arglists)
2396 except KeyboardInterrupt, e: 2404 except KeyboardInterrupt, e:
2397 pool.terminate() 2405 pool.terminate()
2398 raise e 2406 raise e
2399 else: 2407 else:
2400 for config_name in config_names: 2408 for config_name in config_names:
2401 GenerateOutputForConfig(target_list, target_dicts, data, params, 2409 GenerateOutputForConfig(target_list, target_dicts, data, params,
2402 config_name) 2410 config_name)
OLDNEW
« no previous file with comments | « no previous file | test/dependencies/gyptest-indirect-module-dependency.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698