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

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

Issue 10407108: ninja windows: support precompiled headers (Closed) Base URL: https://gyp.googlecode.com/svn/trunk
Patch Set: update docstrings Created 8 years, 7 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 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 # If we have actions/rules/copies, we depend directly on those, but 370 # If we have actions/rules/copies, we depend directly on those, but
371 # otherwise we depend on dependent target's actions/rules/copies etc. 371 # otherwise we depend on dependent target's actions/rules/copies etc.
372 # We never need to explicitly depend on previous target's link steps, 372 # We never need to explicitly depend on previous target's link steps,
373 # because no compile ever depends on them. 373 # because no compile ever depends on them.
374 compile_depends_stamp = (self.target.actions_stamp or compile_depends) 374 compile_depends_stamp = (self.target.actions_stamp or compile_depends)
375 375
376 # Write out the compilation steps, if any. 376 # Write out the compilation steps, if any.
377 link_deps = [] 377 link_deps = []
378 sources = spec.get('sources', []) + extra_sources 378 sources = spec.get('sources', []) + extra_sources
379 if sources: 379 if sources:
380 pch = None
381 if self.flavor == 'mac':
382 pch = gyp.xcode_emulation.MacPrefixHeader(
383 self.xcode_settings, self.GypPathToNinja,
384 lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang))
385 elif self.flavor == 'win':
386 pch = gyp.msvs_emulation.PrecompiledHeader(
387 self.msvs_settings, config_name, self.GypPathToNinja)
380 link_deps = self.WriteSources( 388 link_deps = self.WriteSources(
381 config_name, config, sources, compile_depends_stamp, 389 config_name, config, sources, compile_depends_stamp, pch)
382 gyp.xcode_emulation.MacPrefixHeader(
383 self.xcode_settings, self.GypPathToNinja,
384 lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang)))
385 # Some actions/rules output 'sources' that are already object files. 390 # Some actions/rules output 'sources' that are already object files.
386 link_deps += [self.GypPathToNinja(f) 391 link_deps += [self.GypPathToNinja(f)
387 for f in sources if f.endswith(self.obj_ext)] 392 for f in sources if f.endswith(self.obj_ext)]
388 393
389 if self.flavor == 'win' and self.target.type == 'static_library': 394 if self.flavor == 'win' and self.target.type == 'static_library':
390 self.target.component_objs = link_deps 395 self.target.component_objs = link_deps
391 396
392 # Write out a link step, if needed. 397 # Write out a link step, if needed.
393 output = None 398 output = None
394 if link_deps or self.target.actions_stamp or actions_depends: 399 if link_deps or self.target.actions_stamp or actions_depends:
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
674 cflags_objc = ['$cflags_c'] + \ 679 cflags_objc = ['$cflags_c'] + \
675 self.xcode_settings.GetCflagsObjC(config_name) 680 self.xcode_settings.GetCflagsObjC(config_name)
676 cflags_objcc = ['$cflags_cc'] + \ 681 cflags_objcc = ['$cflags_cc'] + \
677 self.xcode_settings.GetCflagsObjCC(config_name) 682 self.xcode_settings.GetCflagsObjCC(config_name)
678 elif self.flavor == 'win': 683 elif self.flavor == 'win':
679 cflags = self.msvs_settings.GetCflags(config_name) 684 cflags = self.msvs_settings.GetCflags(config_name)
680 cflags_c = self.msvs_settings.GetCflagsC(config_name) 685 cflags_c = self.msvs_settings.GetCflagsC(config_name)
681 cflags_cc = self.msvs_settings.GetCflagsCC(config_name) 686 cflags_cc = self.msvs_settings.GetCflagsCC(config_name)
682 extra_defines = self.msvs_settings.GetComputedDefines(config_name) 687 extra_defines = self.msvs_settings.GetComputedDefines(config_name)
683 self.WriteVariableList('pdbname', [self.name + '.pdb']) 688 self.WriteVariableList('pdbname', [self.name + '.pdb'])
689 self.WriteVariableList('pchprefix', [self.name])
684 else: 690 else:
685 cflags = config.get('cflags', []) 691 cflags = config.get('cflags', [])
686 cflags_c = config.get('cflags_c', []) 692 cflags_c = config.get('cflags_c', [])
687 cflags_cc = config.get('cflags_cc', []) 693 cflags_cc = config.get('cflags_cc', [])
688 694
689 defines = config.get('defines', []) + extra_defines 695 defines = config.get('defines', []) + extra_defines
690 self.WriteVariableList('defines', [Define(d, self.flavor) for d in defines]) 696 self.WriteVariableList('defines', [Define(d, self.flavor) for d in defines])
691 if self.flavor == 'win': 697 if self.flavor == 'win':
692 self.WriteVariableList('rcflags', 698 self.WriteVariableList('rcflags',
693 [QuoteShellArgument(self.ExpandSpecial(f), self.flavor) 699 [QuoteShellArgument(self.ExpandSpecial(f), self.flavor)
694 for f in self.msvs_settings.GetRcflags(config_name)]) 700 for f in self.msvs_settings.GetRcflags(config_name)])
695 701
696 include_dirs = config.get('include_dirs', []) 702 include_dirs = config.get('include_dirs', [])
697 if self.flavor == 'win': 703 if self.flavor == 'win':
698 include_dirs = self.msvs_settings.AdjustIncludeDirs(include_dirs, 704 include_dirs = self.msvs_settings.AdjustIncludeDirs(include_dirs,
699 config_name) 705 config_name)
700 self.WriteVariableList('includes', 706 self.WriteVariableList('includes',
701 [QuoteShellArgument('-I' + self.GypPathToNinja(i), self.flavor) 707 [QuoteShellArgument('-I' + self.GypPathToNinja(i), self.flavor)
702 for i in include_dirs]) 708 for i in include_dirs])
703 709
704 pch_commands = precompiled_header.GetGchBuildCommands() 710 pch_commands = precompiled_header.GetPchBuildCommands()
705 if self.flavor == 'mac': 711 if self.flavor == 'mac':
706 self.WriteVariableList('cflags_pch_c', 712 self.WriteVariableList('cflags_pch_c',
707 [precompiled_header.GetInclude('c')]) 713 [precompiled_header.GetInclude('c')])
708 self.WriteVariableList('cflags_pch_cc', 714 self.WriteVariableList('cflags_pch_cc',
709 [precompiled_header.GetInclude('cc')]) 715 [precompiled_header.GetInclude('cc')])
710 self.WriteVariableList('cflags_pch_objc', 716 self.WriteVariableList('cflags_pch_objc',
711 [precompiled_header.GetInclude('m')]) 717 [precompiled_header.GetInclude('m')])
712 self.WriteVariableList('cflags_pch_objcc', 718 self.WriteVariableList('cflags_pch_objcc',
713 [precompiled_header.GetInclude('mm')]) 719 [precompiled_header.GetInclude('mm')])
714 720
(...skipping 26 matching lines...) Expand all
741 elif self.flavor == 'win' and ext == 'rc': 747 elif self.flavor == 'win' and ext == 'rc':
742 command = 'rc' 748 command = 'rc'
743 obj_ext = '.res' 749 obj_ext = '.res'
744 else: 750 else:
745 # Ignore unhandled extensions. 751 # Ignore unhandled extensions.
746 continue 752 continue
747 input = self.GypPathToNinja(source) 753 input = self.GypPathToNinja(source)
748 output = self.GypPathToUniqueOutput(filename + obj_ext) 754 output = self.GypPathToUniqueOutput(filename + obj_ext)
749 implicit = precompiled_header.GetObjDependencies([input], [output]) 755 implicit = precompiled_header.GetObjDependencies([input], [output])
750 self.ninja.build(output, command, input, 756 self.ninja.build(output, command, input,
751 implicit=[gch for _, _, gch in implicit], 757 implicit=implicit,
752 order_only=predepends) 758 order_only=predepends)
753 outputs.append(output) 759 outputs.append(output)
754 760
755 self.WritePchTargets(pch_commands) 761 self.WritePchTargets(pch_commands)
756 762
757 self.ninja.newline() 763 self.ninja.newline()
758 return outputs 764 return outputs
759 765
760 def WritePchTargets(self, pch_commands): 766 def WritePchTargets(self, pch_commands):
761 """Writes ninja rules to compile prefix headers.""" 767 """Writes ninja rules to compile prefix headers."""
762 if not pch_commands: 768 if not pch_commands:
763 return 769 return
764 770
765 for gch, lang_flag, lang, input in pch_commands: 771 for gch, lang_flag, lang, input, extra_variables in pch_commands:
766 var_name = { 772 var_name = {
767 'c': 'cflags_pch_c', 773 'c': 'cflags_pch_c',
768 'cc': 'cflags_pch_cc', 774 'cc': 'cflags_pch_cc',
769 'm': 'cflags_pch_objc', 775 'm': 'cflags_pch_objc',
770 'mm': 'cflags_pch_objcc', 776 'mm': 'cflags_pch_objcc',
771 }[lang] 777 }[lang]
772 778
773 cmd = { 'c': 'cc', 'cc': 'cxx', 'm': 'objc', 'mm': 'objcxx', }.get(lang) 779 cmd = { 'c': 'cc', 'cc': 'cxx', 'm': 'objc', 'mm': 'objcxx', }.get(lang)
774 self.ninja.build(gch, cmd, input, variables=[(var_name, lang_flag)]) 780 variables = [(var_name, lang_flag)]
775 781 variables += extra_variables
782 self.ninja.build(gch, cmd, input, variables=variables)
776 783
777 def WriteLink(self, spec, config_name, config, link_deps): 784 def WriteLink(self, spec, config_name, config, link_deps):
778 """Write out a link step. Fills out target.binary. """ 785 """Write out a link step. Fills out target.binary. """
779 786
780 command = { 787 command = {
781 'executable': 'link', 788 'executable': 'link',
782 'loadable_module': 'solink_module', 789 'loadable_module': 'solink_module',
783 'shared_library': 'solink', 790 'shared_library': 'solink',
784 }[spec['type']] 791 }[spec['type']]
785 792
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 depfile='$out.d') 1289 depfile='$out.d')
1283 master_ninja.rule( 1290 master_ninja.rule(
1284 'cxx', 1291 'cxx',
1285 description='CXX $out', 1292 description='CXX $out',
1286 command=('$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc ' 1293 command=('$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc '
1287 '$cflags_pch_cc -c $in -o $out'), 1294 '$cflags_pch_cc -c $in -o $out'),
1288 depfile='$out.d') 1295 depfile='$out.d')
1289 else: 1296 else:
1290 # TODO(scottmg): Requires fork of ninja for dependency and linking 1297 # TODO(scottmg): Requires fork of ninja for dependency and linking
1291 # support: https://github.com/sgraham/ninja 1298 # support: https://github.com/sgraham/ninja
1299 #
1300 # Normally, we want to name the object file when we run compile step. This
1301 # is done with /Fo. However, when compiling a precompiled header, the
1302 # flag is /Fp, so override that in the pch compile step.
1303 master_ninja.variable('outflag', '/Fo')
1292 master_ninja.rule( 1304 master_ninja.rule(
1293 'cc', 1305 'cc',
1294 description='CC $out', 1306 description='CC $out',
1295 command=('cmd /s /c "$cc /nologo /showIncludes ' 1307 command=('cmd /s /c "$cc /nologo /showIncludes '
1296 '@$out.rsp ' 1308 '@$out.rsp '
1297 '$cflags_pch_c /c $in /Fo$out /Fd$pdbname ' 1309 '$cflags_pch_c /c $in $outflag$out $pchobj /Fd$pdbname '
Nico 2012/05/23 20:53:29 Out of interest: Have you compared empty build tim
scottmg 2012/05/24 20:34:39 I didn't time it. I thought about doing it like th
1298 '| ninja-deplist-helper -r . -q -f cl -o $out.dl"'), 1310 '| ninja-deplist-helper -r . -q -f cl -o $out.dl"'),
1299 deplist='$out.dl', 1311 deplist='$out.dl',
1300 rspfile='$out.rsp', 1312 rspfile='$out.rsp',
1301 rspfile_content='$defines $includes $cflags $cflags_c') 1313 rspfile_content='$defines $includes $cflags $cflags_c')
1302 master_ninja.rule( 1314 master_ninja.rule(
1303 'cxx', 1315 'cxx',
1304 description='CXX $out', 1316 description='CXX $out',
1305 command=('cmd /s /c "$cxx /nologo /showIncludes ' 1317 command=('cmd /s /c "$cxx /nologo /showIncludes '
1306 '@$out.rsp ' 1318 '@$out.rsp '
1307 '$cflags_pch_cc /c $in /Fo$out /Fd$pdbname ' 1319 '$cflags_pch_cc /c $in $outflag$out $pchobj /Fd$pdbname '
1308 '| ninja-deplist-helper -r . -q -f cl -o $out.dl"'), 1320 '| ninja-deplist-helper -r . -q -f cl -o $out.dl"'),
1309 deplist='$out.dl', 1321 deplist='$out.dl',
1310 rspfile='$out.rsp', 1322 rspfile='$out.rsp',
1311 rspfile_content='$defines $includes $cflags $cflags_cc') 1323 rspfile_content='$defines $includes $cflags $cflags_cc')
1312 master_ninja.rule( 1324 master_ninja.rule(
1313 'idl', 1325 'idl',
1314 description='IDL $in', 1326 description='IDL $in',
1315 command=('python gyp-win-tool midl-wrapper $outdir ' 1327 command=('python gyp-win-tool midl-wrapper $outdir '
1316 '$tlb $h $dlldata $iid $proxy $in ' 1328 '$tlb $h $dlldata $iid $proxy $in '
1317 '$idlflags')) 1329 '$idlflags'))
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1495 1507
1496 user_config = params.get('generator_flags', {}).get('config', None) 1508 user_config = params.get('generator_flags', {}).get('config', None)
1497 if user_config: 1509 if user_config:
1498 GenerateOutputForConfig(target_list, target_dicts, data, params, 1510 GenerateOutputForConfig(target_list, target_dicts, data, params,
1499 user_config) 1511 user_config)
1500 else: 1512 else:
1501 config_names = target_dicts[target_list[0]]['configurations'].keys() 1513 config_names = target_dicts[target_list[0]]['configurations'].keys()
1502 for config_name in config_names: 1514 for config_name in config_names:
1503 GenerateOutputForConfig(target_list, target_dicts, data, params, 1515 GenerateOutputForConfig(target_list, target_dicts, data, params,
1504 config_name) 1516 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