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

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

Issue 9990006: ninja windows: Support magic idl build rules (Closed) Base URL: https://gyp.googlecode.com/svn/trunk
Patch Set: review fixes Created 8 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | pylib/gyp/msvs_emulation.py » ('j') | pylib/gyp/msvs_emulation.py » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2012 Google Inc. All rights reserved. 1 # Copyright (c) 2012 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 copy 5 import copy
6 import gyp 6 import gyp
7 import gyp.common 7 import gyp.common
8 import gyp.msvs_emulation 8 import gyp.msvs_emulation
9 import gyp.MSVSVersion 9 import gyp.MSVSVersion
10 import gyp.system_test 10 import gyp.system_test
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 377
378 if self.name != output and self.toolset == 'target': 378 if self.name != output and self.toolset == 'target':
379 # Write a short name to build this target. This benefits both the 379 # Write a short name to build this target. This benefits both the
380 # "build chrome" case as well as the gyp tests, which expect to be 380 # "build chrome" case as well as the gyp tests, which expect to be
381 # able to run actions and build libraries by their short name. 381 # able to run actions and build libraries by their short name.
382 self.ninja.build(self.name, 'phony', output) 382 self.ninja.build(self.name, 'phony', output)
383 383
384 assert self.target.FinalOutput(), output 384 assert self.target.FinalOutput(), output
385 return self.target 385 return self.target
386 386
387 def _IdlRule(self, source, prebuild, outputs):
388 """Handle the implicit VS .idl rule for one source file. Fills |outputs|
389 with files that are generated."""
Nico 2012/04/05 18:02:24 assert self.flavor == 'win' it would be nice if m
scottmg 2012/04/05 18:14:26 Done.
390 outdir, output, vars, flags = self.msvs_settings.GetIdlBuildData(
391 source, self.config_name)
392 outdir = self.GypPathToNinja(outdir)
393 def fix_path(path, rel=None):
394 path = os.path.join(outdir, path)
395 dirname, basename = os.path.split(source)
396 root, ext = os.path.splitext(basename)
397 path = self.ExpandRuleVariables(
398 path, root, dirname, source, ext, basename)
399 if rel:
400 path = os.path.relpath(path, rel)
401 return path
402 vars = [(name, fix_path(value, outdir)) for name, value in vars]
403 output = [fix_path(p) for p in output]
404 vars.append(('outdir', outdir))
405 vars.append(('idlflags', flags))
406 input = self.GypPathToNinja(source)
407 self.ninja.build(output, 'idl', input,
408 variables=vars, order_only=prebuild)
409 outputs.extend(output)
410
411 def WriteWinIdlFiles(self, spec, prebuild):
412 """Writes rules to match MSVS's implicit idl handling."""
413 if self.msvs_settings.HasExplicitIdlRules(spec):
414 return []
415 outputs = []
416 for source in filter(lambda x: x.endswith('.idl'), spec['sources']):
417 self._IdlRule(source, prebuild, outputs)
418 return outputs
419
387 def WriteActionsRulesCopies(self, spec, extra_sources, prebuild, 420 def WriteActionsRulesCopies(self, spec, extra_sources, prebuild,
388 mac_bundle_depends): 421 mac_bundle_depends):
389 """Write out the Actions, Rules, and Copies steps. Return a path 422 """Write out the Actions, Rules, and Copies steps. Return a path
390 representing the outputs of these steps.""" 423 representing the outputs of these steps."""
391 outputs = [] 424 outputs = []
392 extra_mac_bundle_resources = [] 425 extra_mac_bundle_resources = []
393 426
394 if 'actions' in spec: 427 if 'actions' in spec:
395 outputs += self.WriteActions(spec['actions'], extra_sources, prebuild, 428 outputs += self.WriteActions(spec['actions'], extra_sources, prebuild,
396 extra_mac_bundle_resources) 429 extra_mac_bundle_resources)
397 if 'rules' in spec: 430 if 'rules' in spec:
398 outputs += self.WriteRules(spec['rules'], extra_sources, prebuild, 431 outputs += self.WriteRules(spec['rules'], extra_sources, prebuild,
399 extra_mac_bundle_resources) 432 extra_mac_bundle_resources)
400 if 'copies' in spec: 433 if 'copies' in spec:
401 outputs += self.WriteCopies(spec['copies'], prebuild) 434 outputs += self.WriteCopies(spec['copies'], prebuild)
402 435
436 if 'sources' in spec and self.flavor == 'win':
437 outputs += self.WriteWinIdlFiles(spec, prebuild)
438
403 stamp = self.WriteCollapsedDependencies('actions_rules_copies', outputs) 439 stamp = self.WriteCollapsedDependencies('actions_rules_copies', outputs)
404 440
405 if self.is_mac_bundle: 441 if self.is_mac_bundle:
406 mac_bundle_resources = spec.get('mac_bundle_resources', []) + \ 442 mac_bundle_resources = spec.get('mac_bundle_resources', []) + \
407 extra_mac_bundle_resources 443 extra_mac_bundle_resources
408 self.WriteMacBundleResources(mac_bundle_resources, mac_bundle_depends) 444 self.WriteMacBundleResources(mac_bundle_resources, mac_bundle_depends)
409 self.WriteMacInfoPlist(mac_bundle_depends) 445 self.WriteMacInfoPlist(mac_bundle_depends)
410 446
411 return stamp 447 return stamp
412 448
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 ext = ext[1:] 687 ext = ext[1:]
652 if ext in ('cc', 'cpp', 'cxx'): 688 if ext in ('cc', 'cpp', 'cxx'):
653 command = 'cxx' 689 command = 'cxx'
654 elif ext in ('c', 's', 'S'): 690 elif ext in ('c', 's', 'S'):
655 command = 'cc' 691 command = 'cc'
656 elif self.flavor == 'mac' and ext == 'm': 692 elif self.flavor == 'mac' and ext == 'm':
657 command = 'objc' 693 command = 'objc'
658 elif self.flavor == 'mac' and ext == 'mm': 694 elif self.flavor == 'mac' and ext == 'mm':
659 command = 'objcxx' 695 command = 'objcxx'
660 else: 696 else:
661 # TODO: should we assert here on unexpected extensions? 697 # Ignore unhandled extensions.
662 continue 698 continue
663 input = self.GypPathToNinja(source) 699 input = self.GypPathToNinja(source)
664 output = self.GypPathToUniqueOutput(filename + self.obj_ext) 700 output = self.GypPathToUniqueOutput(filename + self.obj_ext)
665 implicit = precompiled_header.GetObjDependencies([input], [output]) 701 implicit = precompiled_header.GetObjDependencies([input], [output])
666 self.ninja.build(output, command, input, 702 self.ninja.build(output, command, input,
667 implicit=[gch for _, _, gch in implicit], 703 implicit=[gch for _, _, gch in implicit],
668 order_only=predepends) 704 order_only=predepends)
669 outputs.append(output) 705 outputs.append(output)
670 706
671 self.WritePchTargets(pch_commands) 707 self.WritePchTargets(pch_commands)
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after
1177 master_ninja.rule( 1213 master_ninja.rule(
1178 'cxx', 1214 'cxx',
1179 description='CXX $out', 1215 description='CXX $out',
1180 command=('cmd /s /c "$cxx /nologo /showIncludes ' 1216 command=('cmd /s /c "$cxx /nologo /showIncludes '
1181 '@$out.rsp ' 1217 '@$out.rsp '
1182 '$cflags_pch_cc /c $in /Fo$out /Fd$pdbname ' 1218 '$cflags_pch_cc /c $in /Fo$out /Fd$pdbname '
1183 '| ninja-deplist-helper -q -f cl -o $out.dl"'), 1219 '| ninja-deplist-helper -q -f cl -o $out.dl"'),
1184 deplist='$out.dl', 1220 deplist='$out.dl',
1185 rspfile='$out.rsp', 1221 rspfile='$out.rsp',
1186 rspfile_content='$defines $includes $cflags $cflags_cc') 1222 rspfile_content='$defines $includes $cflags $cflags_cc')
1223 master_ninja.rule(
1224 'idl',
1225 description='IDL $in',
1226 command=('python gyp-win-tool midl-wrapper $outdir '
1227 '$tlb $h $dlldata $iid $proxy $in '
1228 '$idlflags'))
1187 1229
1188 if flavor != 'mac' and flavor != 'win': 1230 if flavor != 'mac' and flavor != 'win':
1189 master_ninja.rule( 1231 master_ninja.rule(
1190 'alink', 1232 'alink',
1191 description='AR $out', 1233 description='AR $out',
1192 command='rm -f $out && $ar rcsT $out $in') 1234 command='rm -f $out && $ar rcsT $out $in')
1193 master_ninja.rule( 1235 master_ninja.rule(
1194 'solink', 1236 'solink',
1195 description='SOLINK $out', 1237 description='SOLINK $out',
1196 command=('$ld -shared $ldflags -o $out -Wl,-soname=$soname ' 1238 command=('$ld -shared $ldflags -o $out -Wl,-soname=$soname '
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1352 1394
1353 user_config = params.get('generator_flags', {}).get('config', None) 1395 user_config = params.get('generator_flags', {}).get('config', None)
1354 if user_config: 1396 if user_config:
1355 GenerateOutputForConfig(target_list, target_dicts, data, params, 1397 GenerateOutputForConfig(target_list, target_dicts, data, params,
1356 user_config) 1398 user_config)
1357 else: 1399 else:
1358 config_names = target_dicts[target_list[0]]['configurations'].keys() 1400 config_names = target_dicts[target_list[0]]['configurations'].keys()
1359 for config_name in config_names: 1401 for config_name in config_names:
1360 GenerateOutputForConfig(target_list, target_dicts, data, params, 1402 GenerateOutputForConfig(target_list, target_dicts, data, params,
1361 config_name) 1403 config_name)
OLDNEW
« no previous file with comments | « no previous file | pylib/gyp/msvs_emulation.py » ('j') | pylib/gyp/msvs_emulation.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698