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 import copy | 5 import copy |
6 import hashlib | 6 import hashlib |
7 import multiprocessing | 7 import multiprocessing |
8 import os.path | 8 import os.path |
9 import re | 9 import re |
10 import signal | 10 import signal |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 | 411 |
412 # Write out the compilation steps, if any. | 412 # Write out the compilation steps, if any. |
413 link_deps = [] | 413 link_deps = [] |
414 sources = spec.get('sources', []) + extra_sources | 414 sources = spec.get('sources', []) + extra_sources |
415 if sources: | 415 if sources: |
416 pch = None | 416 pch = None |
417 if self.flavor == 'win': | 417 if self.flavor == 'win': |
418 gyp.msvs_emulation.VerifyMissingSources( | 418 gyp.msvs_emulation.VerifyMissingSources( |
419 sources, self.abs_build_dir, generator_flags, self.GypPathToNinja) | 419 sources, self.abs_build_dir, generator_flags, self.GypPathToNinja) |
420 pch = gyp.msvs_emulation.PrecompiledHeader( | 420 pch = gyp.msvs_emulation.PrecompiledHeader( |
421 self.msvs_settings, config_name, self.GypPathToNinja) | 421 self.msvs_settings, config_name, self.GypPathToNinja, |
| 422 self.GypPathToUniqueOutput, self.obj_ext) |
422 else: | 423 else: |
423 pch = gyp.xcode_emulation.MacPrefixHeader( | 424 pch = gyp.xcode_emulation.MacPrefixHeader( |
424 self.xcode_settings, self.GypPathToNinja, | 425 self.xcode_settings, self.GypPathToNinja, |
425 lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang)) | 426 lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang)) |
426 link_deps = self.WriteSources( | 427 link_deps = self.WriteSources( |
427 config_name, config, sources, compile_depends_stamp, pch, | 428 config_name, config, sources, compile_depends_stamp, pch, |
428 case_sensitive_filesystem, spec) | 429 case_sensitive_filesystem, spec) |
429 # Some actions/rules output 'sources' that are already object files. | 430 # Some actions/rules output 'sources' that are already object files. |
430 link_deps += [self.GypPathToNinja(f) | 431 link_deps += [self.GypPathToNinja(f) |
431 for f in sources if f.endswith(self.obj_ext)] | 432 for f in sources if f.endswith(self.obj_ext)] |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
815 continue | 816 continue |
816 input = self.GypPathToNinja(source) | 817 input = self.GypPathToNinja(source) |
817 output = self.GypPathToUniqueOutput(filename + obj_ext) | 818 output = self.GypPathToUniqueOutput(filename + obj_ext) |
818 # Ninja's depfile handling gets confused when the case of a filename | 819 # Ninja's depfile handling gets confused when the case of a filename |
819 # changes on a case-insensitive file system. To work around that, always | 820 # changes on a case-insensitive file system. To work around that, always |
820 # convert .o filenames to lowercase on such file systems. See | 821 # convert .o filenames to lowercase on such file systems. See |
821 # https://github.com/martine/ninja/issues/402 for details. | 822 # https://github.com/martine/ninja/issues/402 for details. |
822 if not case_sensitive_filesystem: | 823 if not case_sensitive_filesystem: |
823 output = output.lower() | 824 output = output.lower() |
824 implicit = precompiled_header.GetObjDependencies([input], [output]) | 825 implicit = precompiled_header.GetObjDependencies([input], [output]) |
| 826 variables = [] |
| 827 if self.flavor == 'win': |
| 828 variables, output, implicit = precompiled_header.GetFlagsModifications( |
| 829 input, output, implicit, command, cflags_c, cflags_cc, |
| 830 self.ExpandSpecial) |
825 self.ninja.build(output, command, input, | 831 self.ninja.build(output, command, input, |
826 implicit=[gch for _, _, gch in implicit], | 832 implicit=[gch for _, _, gch in implicit], |
827 order_only=predepends) | 833 order_only=predepends, variables=variables) |
828 outputs.append(output) | 834 outputs.append(output) |
829 | 835 |
830 self.WritePchTargets(pch_commands) | 836 self.WritePchTargets(pch_commands) |
831 | 837 |
832 self.ninja.newline() | 838 self.ninja.newline() |
833 return outputs | 839 return outputs |
834 | 840 |
835 def WritePchTargets(self, pch_commands): | 841 def WritePchTargets(self, pch_commands): |
836 """Writes ninja rules to compile prefix headers.""" | 842 """Writes ninja rules to compile prefix headers.""" |
837 if not pch_commands: | 843 if not pch_commands: |
838 return | 844 return |
839 | 845 |
840 for gch, lang_flag, lang, input in pch_commands: | 846 for gch, lang_flag, lang, input in pch_commands: |
841 var_name = { | 847 var_name = { |
842 'c': 'cflags_pch_c', | 848 'c': 'cflags_pch_c', |
843 'cc': 'cflags_pch_cc', | 849 'cc': 'cflags_pch_cc', |
844 'm': 'cflags_pch_objc', | 850 'm': 'cflags_pch_objc', |
845 'mm': 'cflags_pch_objcc', | 851 'mm': 'cflags_pch_objcc', |
846 }[lang] | 852 }[lang] |
847 | 853 |
848 map = { 'c': 'cc', 'cc': 'cxx', 'm': 'objc', 'mm': 'objcxx', } | 854 map = { 'c': 'cc', 'cc': 'cxx', 'm': 'objc', 'mm': 'objcxx', } |
849 if self.flavor == 'win': | |
850 map.update({'c': 'cc_pch', 'cc': 'cxx_pch'}) | |
851 cmd = map.get(lang) | 855 cmd = map.get(lang) |
852 self.ninja.build(gch, cmd, input, variables=[(var_name, lang_flag)]) | 856 self.ninja.build(gch, cmd, input, variables=[(var_name, lang_flag)]) |
853 | 857 |
854 def WriteLink(self, spec, config_name, config, link_deps): | 858 def WriteLink(self, spec, config_name, config, link_deps): |
855 """Write out a link step. Fills out target.binary. """ | 859 """Write out a link step. Fills out target.binary. """ |
856 | 860 |
857 command = { | 861 command = { |
858 'executable': 'link', | 862 'executable': 'link', |
859 'loadable_module': 'solink_module', | 863 'loadable_module': 'solink_module', |
860 'shared_library': 'solink', | 864 'shared_library': 'solink', |
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1448 description='CC $out', | 1452 description='CC $out', |
1449 command=('$cc $defines $includes $cflags $cflags_c ' | 1453 command=('$cc $defines $includes $cflags $cflags_c ' |
1450 '$cflags_pch_c -c $in -o $out')) | 1454 '$cflags_pch_c -c $in -o $out')) |
1451 master_ninja.rule( | 1455 master_ninja.rule( |
1452 'cxx', | 1456 'cxx', |
1453 description='CXX $out', | 1457 description='CXX $out', |
1454 command=('$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc ' | 1458 command=('$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc ' |
1455 '$cflags_pch_cc -c $in -o $out'), | 1459 '$cflags_pch_cc -c $in -o $out'), |
1456 depfile='$out.d') | 1460 depfile='$out.d') |
1457 else: | 1461 else: |
1458 # Template for compile commands mostly shared between compiling files | 1462 cc_command = ('ninja -t msvc -o $out -e $arch ' |
1459 # and generating PCH. In the case of PCH, the "output" is specified by /Fp | 1463 '-- ' |
1460 # rather than /Fo (for object files), but we still need to specify an /Fo | 1464 '$cc /nologo /showIncludes /FC ' |
1461 # when compiling PCH. | 1465 '@$out.rsp /c $in /Fo$out /Fd$pdbname ') |
1462 cc_template = ('ninja -t msvc -o $out -e $arch ' | 1466 cxx_command = ('ninja -t msvc -o $out -e $arch ' |
1463 '-- ' | 1467 '-- ' |
1464 '$cc /nologo /showIncludes /FC ' | 1468 '$cxx /nologo /showIncludes /FC ' |
1465 '@$out.rsp ' | 1469 '@$out.rsp /c $in /Fo$out /Fd$pdbname ') |
1466 '$cflags_pch_c /c $in %(outspec)s /Fd$pdbname ') | |
1467 cxx_template = ('ninja -t msvc -o $out -e $arch ' | |
1468 '-- ' | |
1469 '$cxx /nologo /showIncludes /FC ' | |
1470 '@$out.rsp ' | |
1471 '$cflags_pch_cc /c $in %(outspec)s $pchobj /Fd$pdbname ') | |
1472 master_ninja.rule( | 1470 master_ninja.rule( |
1473 'cc', | 1471 'cc', |
1474 description='CC $out', | 1472 description='CC $out', |
1475 command=cc_template % {'outspec': '/Fo$out'}, | 1473 command=cc_command, |
1476 depfile='$out.d', | |
1477 rspfile='$out.rsp', | |
1478 rspfile_content='$defines $includes $cflags $cflags_c') | |
1479 master_ninja.rule( | |
1480 'cc_pch', | |
1481 description='CC PCH $out', | |
1482 command=cc_template % {'outspec': '/Fp$out /Fo$out.obj'}, | |
1483 depfile='$out.d', | 1474 depfile='$out.d', |
1484 rspfile='$out.rsp', | 1475 rspfile='$out.rsp', |
1485 rspfile_content='$defines $includes $cflags $cflags_c') | 1476 rspfile_content='$defines $includes $cflags $cflags_c') |
1486 master_ninja.rule( | 1477 master_ninja.rule( |
1487 'cxx', | 1478 'cxx', |
1488 description='CXX $out', | 1479 description='CXX $out', |
1489 command=cxx_template % {'outspec': '/Fo$out'}, | 1480 command=cxx_command, |
1490 depfile='$out.d', | |
1491 rspfile='$out.rsp', | |
1492 rspfile_content='$defines $includes $cflags $cflags_cc') | |
1493 master_ninja.rule( | |
1494 'cxx_pch', | |
1495 description='CXX PCH $out', | |
1496 command=cxx_template % {'outspec': '/Fp$out /Fo$out.obj'}, | |
1497 depfile='$out.d', | 1481 depfile='$out.d', |
1498 rspfile='$out.rsp', | 1482 rspfile='$out.rsp', |
1499 rspfile_content='$defines $includes $cflags $cflags_cc') | 1483 rspfile_content='$defines $includes $cflags $cflags_cc') |
1500 master_ninja.rule( | 1484 master_ninja.rule( |
1501 'idl', | 1485 'idl', |
1502 description='IDL $in', | 1486 description='IDL $in', |
1503 command=('%s gyp-win-tool midl-wrapper $arch $outdir ' | 1487 command=('%s gyp-win-tool midl-wrapper $arch $outdir ' |
1504 '$tlb $h $dlldata $iid $proxy $in ' | 1488 '$tlb $h $dlldata $iid $proxy $in ' |
1505 '$idlflags' % sys.executable)) | 1489 '$idlflags' % sys.executable)) |
1506 master_ninja.rule( | 1490 master_ninja.rule( |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1791 arglists.append( | 1775 arglists.append( |
1792 (target_list, target_dicts, data, params, config_name)) | 1776 (target_list, target_dicts, data, params, config_name)) |
1793 pool.map(CallGenerateOutputForConfig, arglists) | 1777 pool.map(CallGenerateOutputForConfig, arglists) |
1794 except KeyboardInterrupt, e: | 1778 except KeyboardInterrupt, e: |
1795 pool.terminate() | 1779 pool.terminate() |
1796 raise e | 1780 raise e |
1797 else: | 1781 else: |
1798 for config_name in config_names: | 1782 for config_name in config_names: |
1799 GenerateOutputForConfig(target_list, target_dicts, data, params, | 1783 GenerateOutputForConfig(target_list, target_dicts, data, params, |
1800 config_name) | 1784 config_name) |
OLD | NEW |