Chromium Code Reviews| Index: pylib/gyp/generator/ninja.py | 
| =================================================================== | 
| --- pylib/gyp/generator/ninja.py (revision 1197) | 
| +++ pylib/gyp/generator/ninja.py (working copy) | 
| @@ -42,6 +42,15 @@ | 
| 'RULE_INPUT_NAME': '${name}', | 
| } | 
| +# TODO(scottmg): This seems wrong, should be based on flavor. How do we push | 
| +# these back in later? | 
| 
 
Evan Martin
2012/02/14 19:07:29
See make.py:
def CalculateVariables(default_varia
 
Nico
2012/02/14 19:14:10
See also the same function in ninja.py :-)
 
 | 
| +if sys.platform == 'win32': | 
| + generator_default_variables['EXECUTABLE_SUFFIX'] = '.exe' | 
| + generator_default_variables['STATIC_LIB_PREFIX'] = '' | 
| + generator_default_variables['STATIC_LIB_SUFFIX'] = '.lib' | 
| + generator_default_variables['SHARED_LIB_PREFIX'] = '' | 
| + generator_default_variables['SHARED_LIB_SUFFIX'] = '.dll' | 
| + | 
| # TODO: enable cross compiling once we figure out: | 
| # - how to not build extra host objects in the non-cross-compile case. | 
| # - how to decide what the host compiler is (should not just be $cc). | 
| @@ -76,7 +85,7 @@ | 
| return path | 
| # Only need to handle relative paths into subdirectories for now. | 
| assert '..' not in path, path | 
| - depth = len(path.split('/')) | 
| + depth = len(path.split(os.path.sep)) | 
| 
 
scottmg
2012/02/14 18:58:48
This was *sneaky*! Paths were ../blah instead of .
 
Evan Martin
2012/02/14 19:07:29
Is there value in allowing us to generate files ac
 
 | 
| return '/'.join(['..'] * depth) | 
| @@ -180,6 +189,7 @@ | 
| self.ninja = ninja_syntax.Writer(output_file) | 
| self.flavor = flavor | 
| self.abs_build_dir = abs_build_dir | 
| + self.obj_ext = '.obj' if flavor == 'win' else '.o' | 
| # Relative path from build output dir to base dir. | 
| self.build_to_base = os.path.join(InvertRelativePath(build_dir), base_dir) | 
| @@ -348,7 +358,8 @@ | 
| self.xcode_settings, self.GypPathToNinja, | 
| lambda path, lang: self.GypPathToUniqueOutput(path + '-' + lang))) | 
| # Some actions/rules output 'sources' that are already object files. | 
| - link_deps += [self.GypPathToNinja(f) for f in sources if f.endswith('.o')] | 
| + link_deps += [self.GypPathToNinja(f) | 
| + for f in sources if f.endswith(self.obj_ext)] | 
| # Write out a link step, if needed. | 
| output = None | 
| @@ -627,7 +638,7 @@ | 
| # TODO: should we assert here on unexpected extensions? | 
| continue | 
| input = self.GypPathToNinja(source) | 
| - output = self.GypPathToUniqueOutput(filename + '.o') | 
| + output = self.GypPathToUniqueOutput(filename + self.obj_ext) | 
| implicit = precompiled_header.GetObjDependencies([input], [output]) | 
| self.ninja.build(output, command, input, | 
| implicit=[gch for _, _, gch in implicit], | 
| @@ -1004,7 +1015,10 @@ | 
| gyp.common.CopyTool(flavor, os.path.join(options.toplevel_dir, build_dir)) | 
| # Grab make settings for CC/CXX. | 
| - cc, cxx = 'gcc', 'g++' | 
| + if flavor == 'win': | 
| + cc = cxx = 'cl' | 
| + else: | 
| + cc, cxx = 'gcc', 'g++' | 
| build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0]) | 
| make_global_settings = data[build_file].get('make_global_settings', []) | 
| build_to_root = InvertRelativePath(build_dir) | 
| @@ -1017,27 +1031,46 @@ | 
| flock = './gyp-mac-tool flock' | 
| master_ninja.variable('cc', os.environ.get('CC', cc)) | 
| master_ninja.variable('cxx', os.environ.get('CXX', cxx)) | 
| - master_ninja.variable('ld', flock + ' linker.lock $cxx') | 
| + if flavor == 'win': | 
| + master_ninja.variable('ld', 'link') | 
| + else: | 
| + master_ninja.variable('ld', flock + ' linker.lock $cxx') | 
| master_ninja.variable('cc_host', '$cc') | 
| master_ninja.variable('cxx_host', '$cxx') | 
| if flavor == 'mac': | 
| master_ninja.variable('mac_tool', os.path.join('.', 'gyp-mac-tool')) | 
| master_ninja.newline() | 
| - master_ninja.rule( | 
| - 'cc', | 
| - description='CC $out', | 
| - command=('$cc -MMD -MF $out.d $defines $includes $cflags $cflags_c ' | 
| - '$cflags_pch_c -c $in -o $out'), | 
| - depfile='$out.d') | 
| - master_ninja.rule( | 
| - 'cxx', | 
| - description='CXX $out', | 
| - command=('$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc ' | 
| - '$cflags_pch_cc -c $in -o $out'), | 
| - depfile='$out.d') | 
| - if flavor != 'mac': | 
| + if flavor != 'win': | 
| master_ninja.rule( | 
| + 'cc', | 
| + description='CC $out', | 
| + command=('$cc -MMD -MF $out.d $defines $includes $cflags $cflags_c ' | 
| + '$cflags_pch_c -c $in -o $out'), | 
| + depfile='$out.d') | 
| + master_ninja.rule( | 
| + 'cxx', | 
| + description='CXX $out', | 
| + command=('$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc ' | 
| + '$cflags_pch_cc -c $in -o $out'), | 
| + depfile='$out.d') | 
| + else: | 
| + # TODO(scottmg): Decide how /showIncludes handling should work in ninja. | 
| + master_ninja.rule( | 
| + 'cc', | 
| + description='CC $out', | 
| + command=('$cc /nologo $defines $includes $cflags $cflags_c ' | 
| + '$cflags_pch_c /c $in /Fo$out'), | 
| + depfile='$out.d') | 
| + master_ninja.rule( | 
| + 'cxx', | 
| + description='CXX $out', | 
| + command=('$cxx /nologo $defines $includes $cflags $cflags_cc ' | 
| + '$cflags_pch_cc /c $in /Fo$out'), | 
| + depfile='$out.d') | 
| + | 
| + if flavor != 'mac' and flavor != 'win': | 
| + master_ninja.rule( | 
| 'alink', | 
| description='AR $out', | 
| command='rm -f $out && ar rcsT $out $in') | 
| @@ -1056,6 +1089,23 @@ | 
| description='LINK $out', | 
| command=('$ld $ldflags -o $out -Wl,-rpath=\$$ORIGIN/lib ' | 
| '-Wl,--start-group $in -Wl,--end-group $libs')) | 
| + elif flavor == 'win': | 
| + master_ninja.rule( | 
| + 'alink', | 
| + description='AR $out', | 
| + command='lib /nologo /OUT:$out.lib $in') | 
| + master_ninja.rule( | 
| + 'solink', | 
| + description='SOLINK $out', | 
| + command=('$ld /nologo /DLL $ldflags /OUT:$out.dll $in $libs')) | 
| + master_ninja.rule( | 
| + 'solink_module', | 
| + description='SOLINK(module) $out', | 
| + command=('$ld /nologo /DLL $ldflags /OUT:$out.dll $in $libs')) | 
| + master_ninja.rule( | 
| + 'link', | 
| + description='LINK $out', | 
| + command=('$ld /nologo $ldflags /OUT:$out.exe $in $libs')) | 
| else: | 
| master_ninja.rule( | 
| 'objc', | 
| @@ -1110,10 +1160,17 @@ | 
| 'stamp', | 
| description='STAMP $out', | 
| command='${postbuilds}touch $out') | 
| - master_ninja.rule( | 
| - 'copy', | 
| - description='COPY $in $out', | 
| - command='ln -f $in $out 2>/dev/null || (rm -rf $out && cp -af $in $out)') | 
| + if flavor == 'win': | 
| + # TODO(scottmg): Copy fallback? | 
| + master_ninja.rule( | 
| + 'copy', | 
| + description='COPY $in $out', | 
| + command='mklink /h $out $in >nul') | 
| + else: | 
| + master_ninja.rule( | 
| + 'copy', | 
| + description='COPY $in $out', | 
| + command='ln -f $in $out 2>/dev/null || (rm -rf $out && cp -af $in $out)') | 
| master_ninja.newline() | 
| all_targets = set() |